我试图反序列化一个Facebook朋友的图形API调用到一个对象列表。JSON对象看起来像:
{"data":[{"id":"518523721","name":"ftyft"},
{"id":"527032438","name":"ftyftyf"},
{"id":"527572047","name":"ftgft"},
{"id":"531141884","name":"ftftft"},
{"id":"532652067","name"...
List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result);
它不起作用,因为原始对象无效。我怎么反序列化这个?
Newtonsoft。JSON是这类情况的一个很好的解决方案。也Newtonsof。JSON比JavaScriptSerializer, DataContractJsonSerializer更快。
在这个示例中,您可以执行以下操作:
var jsonData = JObject.Parse("your JSON data here");
然后可以将jsonData转换为JArray,并且可以在每次迭代中使用for循环获取数据。
另外,我还想补充一点:
for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
var data = jsonData[i - 1];
}
使用动态对象和Newtonsoft序列化是一个很好的选择。
你需要创建一个这样的结构:
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