【问题标题】:C#.NET Core : Cannot deserialize JSON stringC#.NET Core:无法反序列化 JSON 字符串
【发布时间】:2023-03-12 02:35:02
【问题描述】:

我正在尝试将我的 JSON 字符串结果从 Rest-API 服务调用反序列化到我自己的类中:

收到 JSON 字符串:

{
  "valid": true,
  "messages": [
    "Bank code valid: 065656"
  ],
  "iban": "CH65765756756756756",
  "bankData": {
    "bankCode": "083243",
    "name": "Banque of America",
    "bic": "VZTRCH98XYY"
  },
  "checkResults": {
    "bankCode": true
  }
}

我的目标班级:

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class IBANValidationResult
{
    [JsonProperty(PropertyName = "Valid")]
    public bool Valid { get; set; }

    [JsonProperty(PropertyName = "Messages")]
    public List<string> Messages { get; set; }

    [JsonProperty(PropertyName = "IBAN")]
    public string IBAN { get; set; }

    [JsonProperty(PropertyName = "BankData")]
    public BankData BankData { get; set; }

    [JsonProperty(PropertyName = "CheckResults")]
    public CheckResults CheckResults { get; set; }
}

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class BankData
{
    [JsonProperty(PropertyName = "BankCode")]
    public string BankCode { get; set; }

    [JsonProperty(PropertyName = "Name")]
    public string Name { get; set; }

    [JsonProperty(PropertyName = "BIC")]
    public string BIC { get; set; }
}

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class CheckResults
{
    [JsonProperty(PropertyName = "BankCode")]
    public bool BankCode { get; set; }
}

这是我尝试将 json 字符串反序列化到我的类中的代码:

using (HttpResponseMessage res = await client.GetAsync(reqUri))
{
    using (HttpContent content = res.Content)
    {
        var data = res.Content.ReadAsStringAsync();
        var jsonObj = JSONConverter.DeserializeObject<IBANValidationResult>(data.Result);
    }
}

我已经尝试了几种解决问题的方法,但总是收到相同的错误消息:

无法反序列化当前 JSON 对象(例如 {"name":"value"}) 输入类型 'System.Collections.Generic.List`1[OttosWebAPI.Models.Validation.IBANValidationResult]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 JSON 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化。路径“有效”,第 2 行,位置 10。

谁能告诉我,我在这里做错了什么?

谢谢

【问题讨论】:

  • 我在阅读您的代码时注意到的事情:1)您没有等待异步操作。您应该等待*Async() 方法而不是使用.Result。 2)您的 JSON 和您的 [JsonProperty] 属性在命名上有所不同,因为它们有不同的情况。一个或两个都可能是掩盖问题。
  • 是的,我知道我不等待,但由于我在后端调试,所以我是否等待并不重要。
  • 那为什么还要让它异步呢?
  • 我想稍后添加等待,当我完成编码时。
  • 调试与否,它在功能上不正确,因此您可能会创建其他问题,从而使您的原始问题更难解决。

标签: c# json .net-core deserialization


【解决方案1】:

我发现,我应该使用 NewtonSoft DeserializeObject 方法,如下所示:

using (HttpResponseMessage res = await client.GetAsync(reqUri))
{
    using (HttpContent content = res.Content)
    {
        var data = res.Content.ReadAsStringAsync();
        var obj = JsonConvert.DeserializeObject<IBANValidationResult>(data.Result);
    
    }
}

这行得通!

抱歉,我因为提交票而禁食。

【讨论】:

    【解决方案2】:

    你的琴弦外壳到处都是,还有一些较低的,一些驼色的等等。

    默认情况下,属性名称匹配区分大小写。您可以指定 不区分大小写。如果 JSON 包含只读值 属性,该值被忽略并且不抛出异常。 取自Microsoft Docs

    先检查一下,然后看看情况如何。错误说 Line 2 Position 10 所以这似乎是第一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多