2024-12-12 06:00:05

用c#反序列化JSON

我试图反序列化一个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);

它不起作用,因为原始对象无效。我怎么反序列化这个?


当前回答

你需要创建一个这样的结构:

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

其他回答

序列化:

// Convert an object to JSON string format
string jsonData = JsonConvert.SerializeObject(obj);

Response.Write(jsonData);

反序列化::

反序列化一个动态对象

  string json = @"{
      'Name': 'name',
      'Description': 'des'
    }";

var res = JsonConvert.DeserializeObject< dynamic>(json);

Response.Write(res.Name);

你需要创建一个这样的结构:

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字符串,就可以帮助你编写所有你需要的代码:

https://app.quicktype.io/

我同意伊卡洛斯的观点(如果可以的话我会发表评论), 但是没有使用CustomObject类, 我会使用字典(以防Facebook添加了一些内容)。

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

or

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

自动生成这些类的一个好方法是复制JSON输出并将其扔到这里:

http://json2csharp.com/

它将为您提供一个修改类以进行反序列化的起点。