简体   繁体   English

在控制台应用程序中将 JSON 反序列化为 C# 中的列表

[英]Deserialize JSON to List in C# in a console application

Error错误

Cannot deserialize the current JSON object (eg {"name":"value"}) into type 'System.Collections.Generic.List`1[ConsoleApp1.Menu]' because the type requires a JSON array (eg [1,2,3]) to deserialize correctly.无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[ConsoleApp1.Menu]”,因为该类型需要一个 JSON 数组(例如 [1,2, 3]) 正确反序列化。 To fix this error either change the JSON to a JSON array (eg [1,2,3]) or change the deserialized type so that it is a normal .NET type (eg not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object.要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型)可以从 JSON 对象反序列化的数组或列表)。 JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 Path 'Test', line 3, position 9.路径“测试”,第 3 行,位置 9。

Question

Why do I get this error?为什么我会收到这个错误?

At the end I want to achieve to write every menu item in the console.最后我想实现在控制台中编写每个菜单项。 For now I am stuck with this error.现在我被这个错误困住了。 How do I achieve a result (Output) like this:我如何实现这样的结果(输出):

ID: 1 Name: Frosted Pumpkin Bread
ID: 2 Name: Ground to Go
...

The Console application控制台应用程序

using System;
using System.Collections.Generic;
using System.Net;
using Newtonsoft.Json;


namespace ConsoleApp1
{
    public class MenuItem
    {
        public string ID { get; set; }
        public string Description { get; set; }
        public string Summary { get; set; }
        public string Name { get; set; }
        public string ImageFile { get; set; }
    }

    public class Menu
    {
        public List<MenuItem> Test { get; set; }
    }


    class Program
    {

        static void Main(string[] args)
        {
          var webclient = new WebClient();
          var json = webclient.DownloadString(@"C:\Users\devuser\source\repos\ConsoleApp1\ConsoleApp1\data.json");
          var model = JsonConvert.DeserializeObject<List<Menu>>(json);

            foreach (var item in model)
            {
                Console.WriteLine();
            }
        }
    }
}

My JSON-File looks like this我的 JSON 文件看起来像这样


{

  "Test": [

    {
      "ID": "1",
      "Description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
      "Summary": "A seasonal delight we offer every autumn.  Pumpking bread with just a bit of spice, cream cheese frosting with just a hint of home.",
      "Name": "Frosted Pumpkin Bread",
      "ImageFile": "pumpkinbread.png"
    },
    {
      "ID": "2",
      "Description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
      "Summary": "Love our coffee? Take it with you so you never have to be without!",
      "Name": "Ground to Go",
      "ImageFile": "granola.png"
    },
    {
      "ID": "3",
      "Description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
      "Summary": "Do you prefer to grind your own coffee? No problem, we'll give you the beans.",
      "Name": "Bean there, done that!",
      "ImageFile": "beans.jpg"
    },
    {
      "ID": "4",
      "Description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
      "Summary": "They're just as round as donuts, but far more healthy! Freshly made every morning before sunrise.",
      "Name": "Fresh Bagels",
      "ImageFile": "bagel.png"
    },
    {
      "ID": "5",
      "Description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
      "Summary": "We've got strawberries, blueberries, apples, bananas - we could list them all, but we'd prefer you come take a look!",
      "Name": "Fresh Fruit",
      "ImageFile": "strawberries.png"
    }
  ]
}

You're trying to deserialize the json as List<Menu>您正在尝试将 json 反序列化为List<Menu>

JsonConvert.DeserializeObject<List<Menu>>(json);

But the json does not contain a List of Menu, it only contains a single Menu object.但是 json 不包含菜单列表,它只包含一个菜单对象。 You can see that the json starts with { }可以看到json以{ }开头

{
    "Test": [...]
}

{ } is a object, [ ] is an Array. { }是一个对象, [ ]是一个数组。 So to be able to deserialize into a List of Menu your json should look like this:因此,为了能够反序列化为菜单列表,您的 json 应如下所示:

[
    {
        "Test": [...]
    }
]

so that you can have multiple Menu, like this:这样你就可以有多个菜单,像这样:

[
    {
        "Test": [...]
    },
    {
        "Test": [...]
    },
    {
        "Test": [...]
    },
]

I hope I was helpful我希望我有帮助

THANX A LOT FOR YOUR ANSWERS!非常感谢您的回答!

Here is the working code!这是工作代码!

using System;
using System.Collections.Generic;
using System.Net;
using Newtonsoft.Json;


namespace ConsoleApp1
{
    public class MenuItem
    {
        public string ID { get; set; }
        public string Description { get; set; }
        public string Summary { get; set; }
        public string Name { get; set; }
        public string ImageFile { get; set; }
    }

    public class Menu
    {
        public List<MenuItem> Test { get; set; }
    }


    class Program
    {

        static void Main(string[] args)
        {
          var webclient = new WebClient();
          var json = webclient.DownloadString(@"C:\Users\devuser\source\repos\ConsoleApp1\ConsoleApp1\data.json");
          var model = JsonConvert.DeserializeObject<Menu>(json);

            foreach (var item in model.Test)
            {
                Console.WriteLine("ID: "+item.ID+" "+"Name: "+item.Name);
            }
        }
    }
}
```

Change this line改变这一行

var model = JsonConvert.DeserializeObject<List<Menu>>(json);

to

var model = JsonConvert.DeserializeObject<Menu>(json);

This is because given json represents an object Menu which contains a List<MenuItem> called Test.这是因为给定的 json 表示一个对象 Menu,其中包含一个名为 Test 的List<MenuItem>

Sample code.示例代码。

DotNetFiddle Code Link DotNetFiddle 代码链接

PS Sample code used a string initialisation instead of loading json from a file. PS 示例代码使用字符串初始化而不是从文件加载 json。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM