System.Text.Json.JsonException: JSON值无法转换

22

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

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

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

起初,我认为我的错误是因为在我的模型中,我的属性是char和C#,据我所见,C#无法将双引号解释为字符,应该是单引号。在浪费时间之前,我只是将我的类型声明更改为字符串,但仍然出现了相同的错误。

有人可以帮帮我吗?

ElevadorModel

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:

输入图像描述


4
请您提供一段 JSON 代码片段以复现该问题。 - David L
4个回答

22

您的输入json以数组为基础令牌,而您期望的是一个对象。 您需要将反序列化更改为对象数组。

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

你好,我是C#的新手。现在这是初始化对象列表的正确方式,对吗?List<ElevadorModel> elevadoresModel = new List<ElevadorModel>(); - nanquim
2
正确的做法是通过 new List<Type>() 实例化列表。但在这种情况下,您不需要事先初始化列表。反序列化程序将为您创建集合。在我的示例中,var 只是 List<ElevadorModel> 的编译器推断。在这种情况下,您可以互换使用它们。 - David L

6

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

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

3

这也是Blazor-客户端的一个问题。对于那些仅调用单个对象的情况,例如:
ClassName = await Http.GetFromJsonAsync<ClassName>($"api/ClassName/{id}");

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

List<ClassName> ListName = await Http.GetFromJsonAsync<List<ClassName>>($"api/ClassName/{id}");

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

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

ListName[0].Property

在您的情况下,后一种解决方案与路径作为输入是可以的。


2
其他答案不是已经说了本质上就是这样吗?但是你没有清楚地提到根本原因是将反序列化对象转换为单个对象而不是集合。 - BenCamps

2
在我的情况下,我正在从HTTP响应体中提取JSON数据进行反序列化。它看起来像这样:
var resp = await _client.GetAsync($"{endpoint}");    
var respBody = await resp.Content.ReadAsStringAsync();
var listOfInstances = JsonSerializer.Deserialize<List<modelType>>(respBody);

然后错误就会出现。经过进一步的调查,我发现respBody字符串中的JSON基础对象(一个数组)被双引号包裹起来了...就像这样:

"[{\"prop\":\"value\"},...]"

所以我添加了

respBody = respBody.Trim('\"');

错误已经改变了!现在它指向一个无效字符 '\ '。 我更改了那一行,以包括

respBody = respBody.Trim('\"').Replace("\\", "");

然后它开始完美地反序列化。

供参考:

var resp = await _client.GetAsync($"{endpoint}");    
var respBody = await resp.Content.ReadAsStringAsync();
respBody = respBody.Trim('\"').Replace("\\", "");
var listOfInstances = JsonSerializer.Deserialize<List<modelType>>(respBody);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接