代码之家  ›  专栏  ›  技术社区  ›  shamim

如何将JSON数组反序列化为字典

  •  -2
  • shamim  · 技术社区  · 6 年前

    陷入反序列化问题需要帮助转换JSON文件和数据数组。我不知道如何将它反序列化到这个对象的字典中。

    我的JSON在文件中是这种格式的-它有几千行长这只是一个示例:

        [
      {
        "movies": [
          "A",
          "B",
          "C",
          "D",
          "E"
        ]
      },
      {
        "movies": [
          "A"
        ]
      },
      {
        "movies": [
          "C",
          "D"
        ]
      }
    ]
    

    到目前为止,我了解JSON结构,我的C#类是

    public class Rootobject
        {
            public Class1[] Property1 { get; set; }
        }
    
        public class Class1
        {
            public string[] movies { get; set; }
        }
    
            var json = "";
    
            // MyObject o;
            using (FileStream s = File.Open(@"D:\test.json", FileMode.Open))
            using (StreamReader sr = new StreamReader(s))
            {
                json = sr.ReadToEnd();
            }
    var tmp = JsonConvert.DeserializeObject<Rootobject>(json);
    

    2 回复  |  直到 6 年前
        1
  •  0
  •   ldam    6 年前

    您发布的代码的问题是,您的JSON对象实际上是一个数组(注意它是如何开始的) [ ] ),但您的代码正试图将其反序列化为单数形式 Rootobject 与JSON的结构不匹配。

    你需要反序列化 Class1[]

    var tmp = JsonConvert.DeserializeObject<Class1[]>(json);
    

    你也在问如何让它进入一个 Dictionary 但为此,您需要一个键值来区分它们。你输入的格式对此没有意义。您需要以下内容:

    测试.json

    [
      {
        "key": "keyValue1",
        "movies": [
          "A",
          "B",
          "C",
          "D",
          "E"
        ]
      },
      {
        "key": "keyValue2",
        "movies": [
          "A"
        ]
      },
      {
        "key": "keyValue3",
        "movies": [
          "C",
          "D"
        ]
      }
    ]
    

    阶级结构

    public class Class1
    {
        public string key { get; set; }
        public string[] movies { get; set; }
    }
    

    var json = "";
    
    // MyObject o;
    using (FileStream s = File.Open(@"D:\test.json", FileMode.Open))
    using (StreamReader sr = new StreamReader(s))
    {
        json = sr.ReadToEnd();
    }
    var tmp = JsonConvert.DeserializeObject<Rootobject[]>(json);
    // don't forget to add using System.Linq;
    var dictionary = tmp.ToDictionary<string, string[]>(o => o.key, o => o.movies);
    
        2
  •  1
  •   Antoine V    6 年前

    只有这个班

        public class Class1
        {
            public string[] movies { get; set; }
        }
    

    你能试试吗

    var tmp = JsonConvert.DeserializeObject<IEnumerable<Class1>>(json);