Как десериализовать эту строку JSON? [Дубликат]

Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте IEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double. Суть проблемы состоит в том, что числа представлены в этом формате как целое число раз в два раза; рациональные числа (такие как 0.1, который является 1/10), знаменатель которого не является степенью двух, не могут быть точно представлены.

Для 0.1 в стандартном формате binary64 представление может записывается в точности как

  • 0.1000000000000000055511151231257827021181583404541015625 в десятичной форме или
  • 0x1.999999999999ap-4 в нотации C99 hexfloat .

Напротив, рациональное число 0.1, которое является 1/10, может быть записано точно как

  • 0.1 в десятичной форме или
  • 0x1.99999999999999...p-4 в аналоге обозначения гексафлоата C99, где ... представляет собой бесконечную последовательность 9.

Константы 0.2 и 0.3 в вашей программе также будут приближенными к их истинные ценности. Бывает, что ближайший double до 0.2 больше, чем рациональное число 0.2, но ближайший double до 0.3 меньше, чем рациональное число 0.3. Сумма 0.1 и 0.2 заканчивается выше, чем рациональное число 0.3 и, следовательно, не согласуется с константой в вашем коде.

Достаточно полное рассмотрение арифметических вопросов с плавающей запятой Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой . Для более простого объяснения см. floating-point-gui.de .

170
задан Markus Safar 1 February 2016 в 15:38
поделиться

5 ответов

Вам нужно создать такую ​​структуру:

public class Friends
{

    public List<FacebookFriend> data {get;set;}
}

public class FacebookFriend
{

    public string id {get;set;}
    public string name {get;set;}
}

Тогда вы должны иметь возможность сделать:

Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);

Имена моих классов - всего лишь пример. Вы должны использовать правильные имена.

Добавление образца теста:

string json=
    @"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}";


Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json);

foreach(var item in facebookFriends.data)
{
   Console.WriteLine("id: {0}, name: {1}",item.id,item.name);
}

Производит:

id: 518523721, name: ftyft
id: 527032438, name: ftyftyf
id: 527572047, name: ftgft
id: 531141884, name: ftftft
222
ответ дан Icarus 4 September 2018 в 09:42
поделиться

Отличным способом автоматического создания этих классов для вас является копирование вашего JSON-вывода и его бросок здесь:

http://json2csharp.com/

Он предоставит вам начальную точку, чтобы подправить ваши классы для десериализации.

17
ответ дан Jack Fairfield 4 September 2018 в 09:42
поделиться

очень легко мы можем разобрать json с помощью словаря и JavaScriptSerializer. Вот пример кода, по которому я разбираю json из файла ashx.

var jss = new JavaScriptSerializer();
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json);
string _Name = sData["Name"].ToString();
string _Subject = sData["Subject"].ToString();
string _Email = sData["Email"].ToString();
string _Details = sData["Details"].ToString();
23
ответ дан Markus Safar 4 September 2018 в 09:42
поделиться

Newtonsoft.JSON является хорошим решением для подобных ситуаций. Кроме того, Newtonsof.JSON работает быстрее других, таких как JavaScriptSerializer, DataContractJsonSerializer.

В этом примере вы можете:

var jsonData = JObject.Parse("your json data here");

Затем вы можете использовать jsonData для JArray, и вы можете использовать для цикла для получения данных на каждой итерации. Кроме того, я хочу что-то добавить.

for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
    var data = jsonData[i - 1];
}

Работа с динамическим объектом и использование сериализации Newtonsoft - хороший выбор.

13
ответ дан Mehdi Dehghani 4 September 2018 в 09:42
поделиться

Я согласен с Icarus (мог бы прокомментировать, если бы мог), но вместо использования класса CustomObject я бы использовал словарь (в случае, если Facebook добавит что-то).

private class MyFacebookClass
{
   public IList<IDictionary<string, string>> data { get; set; }
}

или

private class MyFacebookClass
{
   public IList<IDictionary<string, object>> data { get; set; }
}
14
ответ дан Stijn Bollen 4 September 2018 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: