将JSON反序列化为c#对象引发异常

时间:2019-02-27 15:18:20

标签: c# serialization json.net json-deserialization

请帮助我将以下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])反序列化为type   'RootObject',因为类型需要JSON对象(例如   {“ name”:“ value”})正确反序列化。要解决此错误,请   将JSON更改为JSON对象(例如{“ name”:“ value”})或更改   将反序列化类型转换为数组或实现集合的类型   接口(例如ICollection,IList),例如List   从JSON数组反序列化。也可以添加JsonArrayAttribute   类型,以强制其从JSON数组反序列化。路径'',   第1行,位置1。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-3)

编辑为完整答案:

using Newtonsoft.Json;

class Program
{
    public partial class RootObject
    {
        [JsonProperty("detectedLanguage")]
        public DetectedLanguage DetectedLanguage { get; set; }

        [JsonProperty("translations")]
        public Translation[] Translations { get; set; }
    }

    public partial class DetectedLanguage
    {
        [JsonProperty("language")]
        public string Language { get; set; }

        [JsonProperty("score")]
        public long Score { get; set; }
    }

    public partial class Translation
    {
        [JsonProperty("text")]
        public string Text { get; set; }

        [JsonProperty("to")]
        public string To { get; set; }
    }

    public partial class RootObject
    {
        public static RootObject[] FromJson(string jsonresponse) => JsonConvert.DeserializeObject<RootObject[]>(jsonresponse);
    }

    static void Main(string[] args)
    {
        var response = client.SendAsync(request).Result;
        var jsonResponse = response.Content.ReadAsStringAsync().Result;
        var result = RootObject.FromJson(jsonResponse);
        System.Console.WriteLine(result[0].DetectedLanguage.Language); //outputs "en"
    }
}