Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте 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 .
Вам нужно создать такую структуру:
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
Отличным способом автоматического создания этих классов для вас является копирование вашего JSON-вывода и его бросок здесь:
Он предоставит вам начальную точку, чтобы подправить ваши классы для десериализации.
очень легко мы можем разобрать 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();
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 - хороший выбор.
Я согласен с 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; }
}