Json反序列化Dictionary <key,value>返回为null

时间:2019-04-09 07:41:30

标签: c# json json.net

一个快速的!

我有三个对象类。

public class Parent
{
    public string name { get; set; }
    public Children child{ get; set; }
}

public class Children
{
    public Dictionary<string, item> item{ get; set; }
}

public class item
{
    public string id { get; set; }
    public string type { get; set; }
}

我正在使用的JSON字符串:

        {
            'name': 'Child1',
            'Children': {
               'item-1253': {
                   'id': 'car',
                   'type': 'car'
               },
               'item-4343': {
                   'id': 'car',
                   'type': 'car'
               }......
           }
        }

使用过:

test = JsonConvert.DeserializeObject<Parent>(json);

输出为"item": null。我可以问为什么吗?我如何访问此项目对象内的所有属性,因为每个孩子会有多个项目,并且项目对象名称是动态的,例如item_id12434。我希望对象独立存在,如何实现?这样的事情行吗? List<Dictionary<string, item>>

2 个答案:

答案 0 :(得分:0)

修改您的类使其看起来像这样,它将正确反序列化。

public static class Program
{
    static void Main(string[] args)
    {
        string str = @"{
                'name': 'Child1',
                'Children': {
                    'item-1253': {
                        'id': 'car',
                        'type': 'car'
                    },
                    'item-4343': {
                        'id': 'car',
                        'type': 'car'
                    }
                }
            }";

        // Way 1) Using POCO
        Parent parent = JsonConvert.DeserializeObject<Parent>(str);

        // Way 2) Using dynamic
            dynamic deserializedDynamicObject = JsonConvert.DeserializeObject<dynamic>(str);

        // Way 3) Using JObject
        JObject deserializedJObject = JsonConvert.DeserializeObject<JObject>(str);
        List<JObject> childrenObjects = deserializedJObject["Children"]
                                        .Cast<JProperty>()
                                        .Select(x => x.Value)
                                        .Cast<JObject>()
                                        .ToList();
    }
}

public class Parent
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("Children")]
    public Dictionary<string, Item> Children { get; set; }
}

public class Item
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }
}

答案 1 :(得分:0)

已修复示例:https://dotnetfiddle.net/7TK008


请查看工作示例-https://dotnetfiddle.net/eiMEkr

您提出两个问题:

  1. 错误的参数名称​​孩子-应该是孩子

  2. 词典对象的错误定义

    const string json = @"
                {
                   'name':'Child1',
                   'child':{
                      'item':{
                         'dict_item':{
                            'id':'car1',
                            'type':'car2'
                         }
                      }
                   }
                }";

   var test = JsonConvert.DeserializeObject<Parent>(json);
相关问题