@BashkaMen
C# программист

Как десереализировать этот JSON?

Всем привет, впервые столкнулся с таким Json.
Я его обрезал, но вообще там много предметов в таком виде.

{
  "responce": {
    "AK-47 | Aquamarine Revenge (Battle-Scarred)": {
      "2017-09-12": {
        "mean": 983,
        "min": 940,
        "max": 1124,
        "normalized_mean": 985,
        "normalized_min": 958,
        "normalized_max": 1008,
        "std_dev": 26
      },
      "2017-09-13": {
        "mean": 2977,
        "min": 2690,
        "max": 4999,
        "normalized_mean": 2809,
        "normalized_min": 2690,
        "normalized_max": 3022,
        "std_dev": 589
      }
    },
    "AK-47 | Aquamarine Revenge (Factory New)": {
      "2017-09-12": {
        "mean": 2820,
        "min": 2700,
        "max": 2923,
        "normalized_mean": 2824,
        "normalized_min": 2780,
        "normalized_max": 2844,
        "std_dev": 51
      },
      "2017-09-13": {
        "mean": 2977,
        "min": 2690,
        "max": 4999,
        "normalized_mean": 2809,
        "normalized_min": 2690,
        "normalized_max": 3022,
        "std_dev": 589
      }
    }
  }
}


Как я понял, там используют словарь (ключ-значение) и я сделал такую модель:

public class GetPriceList
    {
        [JsonProperty("response")]
        public Dictionary<string, Dictionary<string, ItemPrice>[]>[] Response { get; set; }
    }

    public class ItemPrice
    {
        [JsonProperty("mean")]
        public int Mean { get; set; }

        [JsonProperty("min")]
        public int Min { get; set; }

        [JsonProperty("max")]
        public int Max { get; set; }

        [JsonProperty("normalized_mean")]
        public int NormalizedMean { get; set; }

        [JsonProperty("normalized_min")]
        public int NormalizedMin { get; set; }

        [JsonProperty("std_dev")]
        public int Std_Dev { get; set; }

    }


Но это не сработало, меня смущает что у них вроде как массив, но не выделен [ ], а просто через запятую, что я не заметил?
  • Вопрос задан
  • 597 просмотров
Решения вопроса 1
@BashkaMen Автор вопроса
C# программист
Вспомнил что dictionary является типо массивом, но почему то в json перечисляется без квадратных скобок.

public class GetPriceList
    {
        [JsonProperty("status")]
        public int Status { get; set; }

        [JsonProperty("time")]
        public int Time { get; set; }

        [JsonProperty("response")]
        public Dictionary<string, Dictionary<DateTime, ItemPrice>> Response { get; set; }
    }

    public class ItemPrice
    {
        [JsonProperty("mean")]
        public int Mean { get; set; }

        [JsonProperty("min")]
        public int Min { get; set; }

        [JsonProperty("max")]
        public int Max { get; set; }

        [JsonProperty("normalized_mean")]
        public int NormalizedMean { get; set; }

        [JsonProperty("normalized_min")]
        public int NormalizedMin { get; set; }

        [JsonProperty("std_dev")]
        public int Std_Dev { get; set; }

    }


Спасибо всем!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Где там массив?
Почему бы не почитать описание формата? https://ru.wikipedia.org/wiki/JSON

И на закуску, вдруг пригодится
https://msdn.microsoft.com/ru-ru/library/bb412179(...

Сконвертировать в словарь:
string json = @"{""key1"":""value1"",""key2"":""value2""}";
var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
https://www.newtonsoft.com/json
Ответ написан
@kttotto
пофиг на чем писать
JSON, это описание объектов в JavaScript. И поле response это не массив, а объект с полями "AK-47 | A...", соответственно и эти поля тоже не массивы.

Вариант первый, некрасивый и похож на хак, это заменить {} у респонса на [], тогда он станет массивом, ну и в остальных нужных местах и можно будет десериализовать к dictionary.

Вариант второй, трансформировать этот Json к другому типу Json. Тут сложнее, потому что нормальных библиотек для этого просто нет. Когда мне это надо было делать, я использовал JUST.net. Что мне в ней понравилось, так это быстрый фидбек от разработчика, если не хватает функционала, то он очень быстро его по Вашему желанию добавит. Ну а после трансформации, десериализуйте его уже во что захотите.

P.S. Тут в процессе диалога с Stalker_RED, еще один вариант созрел. Если Вы уверены в структуре Json объекта, то его можно привести к JObject. Этот объект представляет собой дерево, где Вы сможете взять узлы (поля) первого уровня, у них получить узлы второго уровня, соответственно из каждого из узлов получите имя и значение. Ну так и сформируете свою модель, какую захотите. В Вашем варианте это будет оптимальным решением.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы