首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析Json文件- JsonConvert

解析Json文件- JsonConvert
EN

Stack Overflow用户
提问于 2019-12-20 08:56:35
回答 2查看 91关注 0票数 1

我有类似于:的JSON文件

代码语言:javascript
复制
[
  12,
  [
    {
      "id": "131",
      "name": "Cate"
    },
        {
      "id": "132",
      "name": "Mike"
    }
  ],
  "Result OK"
]

和代码:

代码语言:javascript
复制
        private static void Main(string[] args)
        {
                using (var r = new StreamReader(@"C:\Path\data1.json"))
                {
                    var json = r.ReadToEnd();
                    try
                    {
                        var items = JsonConvert.DeserializeObject<JsonBody>(json);
                        Console.WriteLine(items);
                    }
                    catch (JsonSerializationException ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
        }
        public class JsonBody
        {
            public int someint;
            public List<Dictionary<string, Item>> item;
            public string somestring;

        }
        public class Item
        {
            [JsonProperty("id")] public string id;
            [JsonProperty("name")] public string name;
        }

错误:无法将当前的JSON数组(例如,1,2,3)反序列化为'Json_parser.Parse2+JsonBody‘类型,因为该类型需要一个JSON对象(例如,{“名称”:“值”})才能正确地反序列化.

应该在代码中重写哪些内容以避免此错误。如何正确解析这个JSON?我需要从项目类中获取所有的项目。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-20 09:11:24

由于JSON文档的根是一个列表,所以需要使用C#使用Json.Net将其反序列化为集合类型。不幸的是,这种具有混合元素类型的数据结构有点难以使用。

如果您100%知道文档的根将始终是一个数组,则可以这样反序列化它:

代码语言:javascript
复制
JArray root = JArray.Parse(json);

然后,如果您100%知道该数组的第二个元素是您感兴趣的项的嵌套数组,则可以使用以下方法:

代码语言:javascript
复制
Item[] items = root[1].ToObject<Item[]>();

因此,您的方法可以简化为:

代码语言:javascript
复制
string json = File.ReadAllText(@"C:\Path\data1.json");
JArray root = JArray.Parse(json);
Item[] items = root[1].ToObject<Item[]>();

但是,如果您需要搜索嵌套数组,因为它并不总是第二个元素,您可以使用以下命令:

代码语言:javascript
复制
string json = File.ReadAllText(@"C:\Path\data1.json");
JArray root = JArray.Parse(json);
foreach (var element in root)
    if (element is JArray)
    {
        Item[] items = element.ToObject<Item[]>();
        // ...
    }
票数 1
EN

Stack Overflow用户

发布于 2019-12-20 09:25:36

乍一看,这个问题来自我们用于反序列化的模型。

试一试这一种,在这种情况下,字典只替换为您的模型项:

代码语言:javascript
复制
        public class JsonBody
        {
            public int someint;
            public List<Item> item;
            public string somestring;

        }

正如@LasseV.Karlsen所提到的,它需要反序列化为一个JsonBody列表,因此您还必须修改这一行代码:

代码语言:javascript
复制
var items = JsonConvert.DeserializeObject<List<JsonBody>>(json);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59422363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档