【问题标题】:Json Deserialize Error, Problem C# .Net CoreJson 反序列化错误,问题 C# .Net Core
【发布时间】:2020-06-09 23:13:35
【问题描述】:

我在尝试反序列化从文件中读取的 JSON 时遇到以下问题。我总是知道它不能按对象类型反序列化。这是什么原因造成的?

MyModel.cs

public class MyModel
{
    public List<toppings> Lista { get; set; }
}
public class toppings
{
    public string description { get; set; }
}

Program.cs

static void Main(string[] args)
{
    try
    {
        string json = File.ReadAllText(@"C:\Users\Ricciardo\Documents\Net Core Practice\Pizza\PizzaRead\pizzas.json").ToString();

        MyModel objetos = JsonSerializer.Deserialize<MyModel>(json);

        foreach (var ingrediente in objetos.Lista)
        {
            Console.WriteLine(ingrediente.description.ToString());
        }
    }

    catch (Exception ex)
    {
        Console.Write(ex.Message.ToString());
        throw ex;
    }
    Console.ReadKey();
}

JSON 文件

[
  {
    "toppings": [
      "pepperoni"
    ]
  },
  {
    "toppings": [
      "feta cheese"
    ]
  },
  {
    "toppings": [
      "pepperoni"
    ]
  },
  {
    "toppings": [
      "bacon"
    ]
  }
]

【问题讨论】:

  • 您的 JSON 文件似乎包含一个对象数组,每个对象内部都有另一个配料数组。您可能没有正确映射类。
  • 不是可能不是..绝对不是。
  • 我发布了一个答案,这是一个 JSON > 类映射问题。希望我的回答能够为您提供足够的信息来采取后续步骤 =)

标签: c# json serialization .net-core system.text.json


【解决方案1】:

您的类结构似乎与您的 JSON 结构不匹配。

您的 JSON 结构如下:

  • 阵列
    • 对象
      • 阵列(浇头)

定义您的 MyModel(或 Pizza)类:

public class Pizza
{
    public List<string> Toppings {get; set;}
}

然后更新您的 Program.cs Main 方法:

    static void Main(string[] args)
    {
        try
        {
            string json = File.ReadAllText(@"C:\Users\Ricciardo\Documents\Net Core Practice\Pizza\PizzaRead\pizzas.json").ToString();

            var objetos = JsonSerializer.Deserialize<List<Pizza>>(json);

            foreach (var pizza in objetos)
            {
                //Console.WriteLine(ingrediente.description.ToString());
                // TODO: Manipulate pizza objeto
            }
        }

        catch (Exception ex)
        {
            Console.Write(ex.Message.ToString());
            throw ex;
        }
        Console.ReadKey();
    }

您可能需要稍微调整一下外壳。

另外,附带说明 JSON 的结构方式会带来一些问题。

类似的结构可能会帮助你更多:

[
  {
    "Toppings": [
        {
          "name":"pepperoni"
          "description":"blah"
        },
    ]
  },
]

那么你实际上可以像这样定义一个 Topping 类:

public class Topping 
{
    public string Name {get; set;}

    public string Description {get; set;}
}

然后更改 Pizza 类 (MyModel):

public class Pizza 
{
    public List<Topping> Toppings {get; set;}
}

【讨论】:

  • 您好,感谢您的回复。我无法更改 json 数据源。这就是它的结构。试试你发给我的,但它不起作用:(
【解决方案2】:

您的 JSON 是一个数组,其中每个项目都有 toppings 字符串数组。所以,正确的模型应该是这样的(用JsonPropertyName属性装饰)

using System.Text.Json;
using System.Text.Json.Serialization;

//rest of code

public class MyModel
{
    [JsonPropertyName("toppings")]
    public List<string> Toppings { get; set; }
}

并反序列化为List&lt;MyModel&gt;

var result = JsonSerializer.Deserialize<List<MyModel>>(jsonString);
foreach (var item in result) 
    Console.WriteLine(string.Join(", ", item.Toppings));

它为您提供一个包含 4 个项目的列表,其中每个项目都是一个包含单个字符串的列表

【讨论】:

  • Esta es la solución, funciona a la perfección。 Te lo agradezco muchisimo。无耻
  • @DanielLazarte 对不起,我不懂西班牙语:) 但是欢迎,很高兴为您提供帮助
猜你喜欢
  • 2018-06-13
  • 1970-01-01
  • 2022-01-20
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多