【问题标题】:Json.net deserialize to classJson.net 反序列化到类
【发布时间】:2023-03-14 20:37:01
【问题描述】:

尝试使用 json.net 反序列化这种和平的 json 字符串,但反序列化时总是出现异常。谁能帮我设置类以便反序列化。

谢谢

{
    "type":"some_type",
    "version":"0.1",
    "data":
    {
        "item_name_1":
        {
            "id":266,
            "key":"aaa",
            "name":"aaa",
            "title":"title_1",
            "info":
            {
                "property_1":9,
                "property_2":4,
            }
        },
        "item_name_2":
        {
            "id":266,
            "key":"bbb",
            "name":"bbb",
            "title":"title_2",
            "info":
            {
                "property_1":93,
                "property_2":24,
            }
        }
    }
}

【问题讨论】:

  • "反序列化时获取异常" 最好在问这样的问题时粘贴异常消息。
  • 空引用,但主要问题是如何设置类以便反序列化 item_name_X (每次出现时都可以命名)

标签: c# .net json.net


【解决方案1】:

info 的最后一个属性后面有一个逗号(,),这不应该在那里。 我总是使用jsonlint 来检查我的 json 对象中是否有任何错误。

{
    "type":"some_type",
    "version":"0.1",
    "data":
    {
        "item_name_1":
        {
            "id":266,
            "key":"aaa",
            "name":"aaa",
            "title":"title_1",
            "info":
            {
                "property_1":9,
                "property_2":4
            }
        },
        "item_name_2":
        {
            "id":266,
            "key":"bbb",
            "name":"bbb",
            "title":"title_2",
            "info":
            {
                "property_1":93,
                "property_2":24
            }
        }
    }
}

【讨论】:

  • 只是一个错字。不过,不能反序列化。问题是因为 item_name 可以命名不同 (item_name_1, _2...)
【解决方案2】:

如果我们忽略逗号,这显然是一个错字

问题是因为 item_name 可以命名不同(item_name_1, _2...

是的,完全正确;名称需要匹配。如果您需要映射 匹配的内容,则需要要么 提供自定义转换器,或者(通常更简单)将数据映射到字典中 - 即你可能有:

public Dictionary<string, Item> data {get;set;}

(代表"data":节点)

这将产生键值对,其中每个键是字段名称("item_name_1" 等),每个值是 Item 实例(具有属性 idkeyname等)。

public class MyRootObject {
    public string type {get;set;}
    public string version {get;set;}
    public Dictionary<string, Item> data {get;set;}
}
pulic class Item {
    public int id {get;set;}
    public string key {get;set;}
    public string name {get;set;}
    public string title {get;set;}
    public Dictionary<string,int> info {get;set;}
}

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多