在C#中使用JSON.NET或JavaScriptSerializer反序列化JSON对象

问题描述:

对不起,如果这是之前问过,但我试图寻找一些答案,但我找不到一个。在C#中使用JSON.NET或JavaScriptSerializer反序列化JSON对象

反正我也有类似的问题,这个问题: Parsing JSON using Json.net

它解决了一些问题,但感到困惑我的JSON数据。这里是json数据

{ 
    "messages":[ 
     { 
     "message":"hilo", 
     "timestamp":"23:55", 
     "uid1":"7", 
     "name":"shiftypowers" 
     } 
    ], 
    "total_messages":"1", 
    "last_timestamp":"1304265309", 
    "buddylist":{ 
     "476":{ 
     "name":"Gandang_hari", 
     "status":"1" 
     }, 
     "506":{ 
     "name":"ichigo", 
     "status":"1" 
     }, 
     "186":{ 
     "name":"Jinn", 
     "status":"1" 
     }, 
     "7":{ 
     "name":"shiftypowers", 
     "status":"1" 
     }, 
     "total":4 
    } 
}

如果您注意到数字476,506,186和7--这些是用户ID,并且将在未来处理数千个用户ID。

问题是,我该如何反序列化?

这里是我的代码

public class ElakoChatPollData 
    { 
     public ElakoChatPollData() 
     { 
      messages = new List(); 
     } 
     public List messages { get; set; } 
     public string total_messages { get; set; } 
     public string last_timestamp { get; set; } 
     public buddylist buddylist { get; set; } 
    } 

    public class messages 
    { 
     public string message { get; set; } 
     public string timestamp { get; set; } 
     public string uid1 { get; set; } 
     public string name { get; set; } 
    } 

    public class buddylist 
    { 
     // what should I put here ?? 
     //public List uid { get; set; } // i don't think this is correct 
     public Dictionary Users { get; private set; } 
     public string total { get; set; } 
    } 

    public class userinfo 
    { 
     public string name { get; set; } 
     public string status { get; set; } 
    } 

// and serializing the json looks like this 
JavaScriptSerializer ser = new JavaScriptSerializer(); 
ChatPollData epd = ser.Deserialize<ChatPollData>(jsonchatpoll); 
Console.Writeline(epd.buddylist.Users[0].name); // i get Object reference not set ~~~~

如果上面的代码是正确的。如何可以我能够得到用户的id?和顺便说一句,json的数据将从drupal模块(drupalchat)请求

+0

你能修改上面的JSON来包含这样的uid吗? '“uid”:“476”, “userinfo”:{ “name”:“Gandang_hari”, “status”:“1” }' – 2011-05-01 17:54:25

+0

nope。上述JSON数据将通过网址从drupalchat模块请求 – jaysonragasa 2011-05-01 17:56:00

+0

请我需要一个答案 – jaysonragasa 2011-05-02 06:29:02

一个简单的解决方案是使用newtonsoft json库中包含的linq-to-json类。然后你需要手动实例化你的对象,但是考虑到你的非常简单的文件格式,应该不会有太多的工作。

手动做这件事的好处在于数据格式和内存格式可能会有很大的不同。

// public List<userinfo> uid { get; set; }; // i don't think this is correct 
public Dictionary<int,UserInfo> Users{get;private set;}//I might use something like this 
+0

如果要使用那会是这样的吗? buddylist.Users [0] .NAME?或buddylist.Users [476] .name? – jaysonragasa 2011-05-01 18:15:31

+0

请检查上面更新的代码吗? – jaysonragasa 2011-05-01 18:22:17