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

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

你能帮我把下面的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),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。路径'',第1行,第1位。

c# serialization json.net json-deserialization
2个回答
0
投票

score属性有时会保持float值,但在我的c#类中,有一个datatype int导致异常。在@Ivan Salo的评论之前,我没有注意到。将数据类型int更改为float修复了我的问题。我还使用List来反序列化@Jon Skeet在评论部分中建议的JSON。

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

-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"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.