是什么原因导致 JsonException: JSON 值无法转换?

问题描述 投票:0回答:2

C# 10 / .NET 6 / System.Text.Json

我正在使用一个以 JSON 响应形式返回的 API。我正在尝试使用

System.Text.Json
将 JSON 响应反序列化为类。我收到 JsonException,可以使用帮助来理解我做错了什么。

我调用 API 并存储 JSON 响应:

string json = await Retreive.Fetch(target);

这是

Console.WriteLine(json)
的输出:

[{"id": 1148082,"name": "TestGroup","group_type":"console_group","provisioning_guid": null,"member_count": 1,"current_risk_score": 36.3,"status": "active"},{"id": 1148788,"name": "Group2","group_type": "smart_group","provisioning_guid": null,"member_count": 9,"current_risk_score": 39.7,"status": "active"},{"id": 1148792,"name": "Group3","group_type": "smart_group","provisioning_guid": null,"member_count": 9,"current_risk_score": 39.7,"status": "active"}]

这里有一个印刷精美的版本(如果有帮助的话):

[
  {
    "id": 1148082,
    "name": "TestGroup",
    "group_type": "console_group",
    "provisioning_guid": null,
    "member_count": 1,
    "current_risk_score": 36.3,
    "status": "active"
  },
  {
    "id": 1148788,
    "name": "Group2",
    "group_type": "smart_group",
    "provisioning_guid": null,
    "member_count": 9,
    "current_risk_score": 39.7,
    "status": "active"
  },
  {
    "id": 1148792,
    "name": "Group3",
    "group_type": "smart_group",
    "provisioning_guid": null,
    "member_count": 9,
    "current_risk_score": 39.7,
    "status": "active"
  }
]

使用 Visual Studio 2022 的 Paste JSON As Classes 功能,我得到以下类结构:

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public int id { get; set; }
    public string name { get; set; }
    public string group_type { get; set; }
    public object provisioning_guid { get; set; }
    public int member_count { get; set; }
    public float current_risk_score { get; set; }
    public string status { get; set; }
}

我正在努力:

Rootobject? gag = JsonSerializer.Deserialize<Rootobject>(json);

抛出 JsonException:

未处理的异常。 System.Text.Json.JsonException:JSON 值 无法转换为 KB4.Rootobject。路径: $ |行号: 0 | BytePositionInLine: 1. 在 System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(类型 属性类型)位于 System.Text.Json.Serialization.Converters.ObjectDefaultConverter

1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)    at System.Text.Json.Serialization.JsonConverter
1.TryRead(Utf8JsonReader& 阅读器、类型 typeToConvert、JsonSerializerOptions 选项、ReadStack& 状态、T 和值)位于 System.Text.Json.Serialization.JsonConverter
1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)    at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan
1 utf8Json,JsonTypeInfo jsonTypeInfo,可空
1 actualByteCount)    at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan
1 json,JsonTypeInfo jsonTypeInfo) at System.Text.Json.JsonSerializer.Deserialize[TValue](字符串 json, JsonSerializerOptions 选项)位于 KB4.Kb4.Main() 中 C:\Program.cs:第 188 行 KB4.Kb4.()

我尝试过的一些事情:

  • Rootobject
    类的名称更改为
    GetAllGroups
  • 考虑到响应中的 JSON 可能存在某种格式错误,我将其粘贴到一个文本文件中并从那里加载 JSON,然后再次尝试反序列化。
  • 回顾了在 C# 中反序列化 JSON 数组,但那是使用 JavaScriptSerializer。

以上都不会产生不同的结果。

我做错了什么?

c# json .net system.text.json
2个回答
12
投票

如果你的 json 以此开头,你的 Rootobject 类将会正常工作

{ "property1": [{"id": 1148082,"name": .....] }

并且数组有一个属性名称。但是你的json没有property1,所以你应该直接开始反序列化json数组

Class1[] result = System.Text.Json.JsonSerializer.Deserialize<Class1[]>(json); 

0
投票

这应该有效:

var response = JsonSerializer.Deserialize<List<Rootobject>>(json);
© www.soinside.com 2019 - 2024. All rights reserved.