【问题标题】:System.Text.Json.JsonException: The JSON value could not be convertedSystem.Text.Json.JsonException:无法转换 JSON 值
【发布时间】:2020-01-27 22:52:38
【问题描述】:

我正在使用 Ubuntu 和 dotnet 3.1,运行 vscode 的 c# 扩展。

我需要从 JSON 文件创建一个列表,我的控制器将使用这个模型列表进行一些计算,然后我将传递给它

我关注了 [这些文档][1] 示例

所以,这是我的代码和我遇到的错误

首先,我认为我的错误是因为在模型中我的属性是 char 和 C#,就我所见,无法解释 char 的双引号,它应该是单引号。在浪费时间删除它之前,我只是将我的类型声明更改为字符串,这是同样的错误。

有人可以帮我吗?

电梯型号

using System.Collections.Generic;

namespace Bla
{
    public class ElevadorModel
    {
        public int andar { get; set; }
        public string elevador { get; set; }
        public string turno { get; set; }
    }

}

程序.cs:

class Program
    {
        static void Main(string[] args)
        {

            var path = "../input.json";

            string jsonString;
            
            ElevadorModel elevadoresModel = new ElevadorModel();

            jsonString = File.ReadAllText(path); //GetType().Name = String

            Console.WriteLine(jsonString); //WORKS           

            elevadoresModel = JsonSerializer.Deserialize<ElevadorModel>(jsonString);

        }

【问题讨论】:

  • 您没有向我们展示重现问题的 JSON 的 sn-p。

标签: c# system.text.json


【解决方案1】:

您的输入 json 有一个数组作为基本标记,而您期望的是一个对象。您需要将反序列化更改为对象数组。

var elevadoresModels = JsonSerializer.Deserialize<List<ElevadorModel>>(jsonString);
elevadoresModel = elavoresModels.First();

【讨论】:

  • 嗨,我是 C# 新手。这是现在初始化我的对象列表的正确方法,对吗? List elevadoresModel = new List();
  • 正确,列表实例化是通过new List&lt;Type&gt;() 完成的。也就是说,在这种情况下,您不需要事先初始化列表。反序列化器将为您创建集合。在我的示例中,var 只是List&lt;ElevadorModel&gt; 的编译器推断。在这种情况下,您可以互换使用。
【解决方案2】:

您的输入 JSON 是一个模型数组,但您正试图将其反序列化为单个模型。

var models = JsonSerializer.Deserialize<List<ElevadorModel>>(jsonString);

【讨论】:

  • 这对我有帮助!非常感谢!
【解决方案3】:

这也是 Blazor-Client 端的问题。对于那些调用单个对象的人
例如 ClassName = await Http.GetFromJsonAsync&lt;ClassName&gt;($"api/ClassName/{id}");

这将无法反序列化。使用相同的 System.Text.Json 可以通过以下方式完成:

List&lt;ClassName&gt; ListName = await Http.GetFromJsonAsync&lt;List&lt;ClassName&gt;&gt;($"api/ClassName/{id}");

您可以使用数组或列表。出于某种原因,System.Text.Json 不会出错,并且能够成功反序列化。

要访问您的对象,知道它是单个对象,请使用:

ListName[0].Property

在您的情况下,后一种解决方案很好,但将路径作为输入。

【讨论】:

  • 其他答案基本上不是这样,但是,您没有明确提到根本原因是反序列化为单个对象而不是集合
猜你喜欢
  • 2021-02-09
  • 2021-01-06
  • 1970-01-01
  • 2021-10-14
  • 2019-12-28
  • 1970-01-01
  • 2020-02-25
  • 2020-03-12
相关资源
最近更新 更多