C # десериализация Json с группой параметров - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий Json:

[
  {
    "id": 3707571,
    "name": "Gekochte Eier in Senfsauce, dazu Kartoffeln - oder Kartoffelpüree",
    "category": "Angebot 1",
    "prices": {
      "students": 1.4,
      "employees": 3.1,
      "pupils": null,
      "others": 3.1
    },
    "notes": [
      "Vegetarisch"
    ]
  },
  {
    "id": 3709978,
    "name": "Currywurst mit hausgemachter Currysauce und Pommes frites, dazu bunter Salat",
    "category": "Angebot 2",
    "prices": {
      "students": 2,
      "employees": 3.9,
      "pupils": null,
      "others": 3.9
    },
    "notes": [
      "Schweinefleisch"
    ]
  }
]

Когда я удаляю Price, десериализация работает нормально, и я могу преобразовать ее в объект, используя Json.NET в C #.

Но с учетом цены я получаю сообщение об ошибке, в котором говорится, что ее можно десериализовать только с помощью массива Json.

Объект, который я использовал для десериализации его:

namespace TelegramBot
{
    class Angebot
    {
        [JsonProperty("id")]
        public int id { get; set; }

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

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

        [JsonProperty("prices")]
        public List<float> prices { get; set; }

        [JsonProperty("notes")]
        public IList<string> notes { get; set; }
    }
}

Как я могу десериализовать цены в список с плавающей точкой (или другой тип данных) в C #?

Редактировать:

Как и предполагалось, я изменил свойство цены на массив.Ошибка по-прежнему возникает.

Сообщение об ошибке:

Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Single [] 'потому что для корректной десериализации типу требуется массив JSON (например, [1,2,3]).Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы это был нормальный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например,массив или список), которые можно десериализовать из объекта JSON.
JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализовать из объекта JSON.

Для десериализации Json, который я используюследующая команда:

IList<Angebot> angebotsListe = JsonConvert.DeserializeObject<List<Angebot>>(mealsInformation);

питаниеИнформация - это строка Json.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Это JSON, связанный с ЦЕНАМИ:

"prices": {
  "students": 1.4,
  "employees": 3.1,
  "pupils": null,
  "others": 3.1
},

Это код для хранения этих данных:

[JsonProperty("prices")]
public List<float> prices { get; set; }

Определение JSON представляет собой один объект со свойствами students, employees, pupils, others.Определение C # представляет собой массив (ненулевых) чисел с плавающей точкой.

Решения

Существует три способа исправить это:

1.Измените свой C #, чтобы он соответствовал вашему JSON:

[JsonProperty("prices")]
public Price prices { get; set; }

//...

class Price 
{
    [JsonProperty("students")]
    public float? Students{get;set;}
    [JsonProperty("employees")]
    public float? Employees{get;set;}
    [JsonProperty("pupils")]
    public float? Pupils{get;set;}
    [JsonProperty("prices")]
    public float? Others{get;set;}
    //...
}

2.Измените свой JSON, чтобы он соответствовал вашему C #

"prices": [
  1.4,
  3.1,
  3.1
],

3.Измените оба

JSON:

"prices": [
    {"name":"students","value":1.4},
    {"name":"employees","value":3.1},
    {"name":"pupils","value":null},
    {"name":"others","value":3.1}
 ],

C #:

[JsonProperty("prices")]
public List<Price> prices { get; set; }

//...

class Price 
{
    [JsonProperty("name")]
    public string Name {get;set;}
    [JsonProperty("value")]
    public float? Value {get;set;}
    //...
}
0 голосов
/ 15 октября 2018

Объявить правильный класс

namespace TelegramBot
{
    class Angebot
    {
        [JsonProperty("id")]
        public int id { get; set; }

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

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

        [JsonProperty("prices")]
        public Prices Prices { get; set; }

        [JsonProperty("notes")]
        public IList<string> notes { get; set; }
    }
}

namespace TelegramBot
{
    class Prices
    {
        [JsonProperty("students")]
        public float? students { get; set; }

        [JsonProperty("employees")]
        public float? employees { get; set; }

        [JsonProperty("pupils")]
        public float? pupils { get; set; }

        [JsonProperty("others")]
        public float? others { get; set; }

    }
}
...