首页 > 解决方案 > 将 JSON 反序列化为引发异常的 c# 对象

问题描述

您能否帮我将以下 JSON 反序列化为 c#。

[
  {
    "detectedLanguage": {
      "language": "en",
      "score": 10.0
    },
    "translations": [
      {
        "text": "",
        "to": "da"
      },
      {
        "text": "",
        "to": "da"
      }
    ]
  }
]

我已使用以下 c# 类进行反序列化,但出现异常。

public class DetectedLanguage
{
    public string language { get; set; }
    public int score { get; set; }
}

public class Translation
{
    public string text { get; set; }
    public string to { get; set; }
}

public class RootObject
{
    public DetectedLanguage detectedLanguage { get; set; }
    public List<Translation> translations { get; set; }
}

我的反序列化代码是:

var response = client.SendAsync(request).Result;
var jsonResponse = response.Content.ReadAsStringAsync().Result;
var result = JsonConvert.DeserializeObject<RootObject>(jsonResponse);

例外

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'RootObject',因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组中反序列化。路径'',第 1 行,位置 1。

标签: c#serializationjson.netjson-deserialization

解决方案


score属性有时包含浮点值,但在我的 c# 类中,存在导致异常的数据类型int 在@Ivan Salo发表评论之前我没有注意到。将数据类型int更改为float解决了我的问题。我还使用 List 反序列化 @Jon Skeet 在评论部分建议的 JSON。

public class DetectedLanguage
{
    public string language { get; set; }
    public float score { get; set; }
}

推荐阅读