Десериализовать JSON в c # объект, вызывающий исключение - PullRequest
0 голосов
/ 27 февраля 2019

Не могли бы вы помочь мне десериализовать следующий 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.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Свойство score иногда содержит значение с плавающей запятой, но в моем классе c # есть тип данных int , который вызывает исключение.Я не заметил раньше комментария @ Ивана Сало .Изменение типа данных int на float исправило мою проблему. Я также использовал List для десериализации JSON, который предлагает @Jon Skeet в разделе комментариев.

public class DetectedLanguage
{
    public string language { get; set; }
    public float score { get; set; }
}
0 голосов
/ 27 февраля 2019

Отредактировано как полный ответ:

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"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...