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

问题描述 投票:-2回答:2

坚持反序列化问题需要帮助将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);

无法获得DeserializeObject

c# json
2个回答
0
投票

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

你需要反序列化为Class1[],表明它是一个数组。

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

你也在问如何将它变成Dictionary类型,但为此你需要一个关键值来区分它们。您的传入格式对此没有任何意义。您需要以下内容:

test.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);

1
投票

只有这个班级

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

你能试试吗?

var tmp = JsonConvert.DeserializeObject<IEnumerable<Class1>>(json);
© www.soinside.com 2019 - 2024. All rights reserved.