【问题标题】:Deserialize JSON Object in C# using JSON.NET or JavaScriptSerializer使用 JSON.NET 或 JavaScriptSerializer 在 C# 中反序列化 JSON 对象
【发布时间】:2011-08-16 13:09:43
【问题描述】:

很抱歉,如果之前有人问过这个问题,但我尝试在这里寻找一些答案,但我找不到。

无论如何,我对这个问题也有类似的问题: Parsing JSON using Json.net

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

{ “消息”:[ { “消息”:“希洛”, “时间戳”:“23:55”, “uid1”:“7”, “名称”:“shiftypowers” } ], "total_messages":"1", "last_timestamp":"1304265309", “好友列表”:{ “476”:{ "name":"Gandang_hari", “状态”:“1” }, “506”:{ “名称”:“一护”, “状态”:“1” }, “186”:{ "name":"Jinn", “状态”:“1” }, “7”:{ "name":"shiftypowers", “状态”:“1” }, “总计”:4 } }
如果您注意到数字 476、506、186 和 7 - 这些是用户 ID,将来会处理数千个用户 ID。

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

这是我的代码

公共类 ElakoChatPollData
    {
        公共 ElakoChatPollData()
        {
            消息 = 新列表();
        }
        公共列表消息 { 获取;放; }
        公共字符串 total_messages { 获取;放; }
        公共字符串 last_timestamp { 获取;放; }
        公共好友列表 buddylist { 获取;放; }
    }

    公开课讯息
    {
        公共字符串消息 { 获取;放; }
        公共字符串时间戳 { 获取;放; }
        公共字符串 uid1 { 获取;放; }
        公共字符串名称 { 获取;放; }
    }

    公开课好友
    {
        // 我应该在这里放什么??
        //公共列表 uid { get;放; } // 我不认为这是正确的
        公共字典用户{得到;私人套装; }
        公共字符串总计 { 获取;放; }
    }

    公共类用户信息
    {
        公共字符串名称 { 获取;放; }
        公共字符串状态 { 获取;放; }
    }

// 并且序列化 json 看起来像这样
JavaScriptSerializer ser = new JavaScriptSerializer();
ChatPollData epd = ser.Deserialize(jsonchatpoll);
Console.Writeline(epd.buddylist.Users[0].name); // 我没有设置对象引用~~~~

如果上面的代码是正确的.. 我怎样才能获得用户 ID?顺便说一句,将从drupal模块(drupalchat)请求json数据

【问题讨论】:

  • 你能修改上面的 JSON 来包含这样的 uid 吗? "uid" : "476", "userinfo" : { "name":"Gandang_hari", "status":"1" }
  • 不。上面的 json 数据将通过 drupalchat 模块中的 url 请求
  • 您是否将其发布到网络服务?也许看看如何反序列化字典weblogs.asp.net/hajan/archive/2010/07/23/…

标签: .net json


【解决方案1】:

一个简单的解决方案是使用包含在 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

【讨论】:

  • 如果要使用它,会是这样的吗? buddylist.Users[0].name?或 buddylist.Users[476].name?
【解决方案2】:

我认为您可以使用 Newtonsoft.Json 库进行序列化或反序列化过程。

Id 值必须在 BuddyList 对象中(这是我的观点)

如果你的回复是这样的:

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

您可以为反序列化创建响应对象:

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

public class Buddylist
{
    public int id { get; set; }
    public string name { get; set; }
    public string status { get; set; }
}

public class ElakoChatPollData
{
    public List<Message> messages { get; set; }
    public string total_messages { get; set; }
    public string last_timestamp { get; set; }
    public List<Buddylist> buddylist { get; set; }
}

当你想序列化这个对象时:

string _serialized = JsonConvert.SerializeObject(_yourObject);

对于反序列化:

var _data = JsonConvert.DeserializeObject<ElakoChatPollData>(_serialized);

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多