Парсинг Json на C#

274
10 марта 2018, 16:16

Прощу подсказать по возможности, как распарсить строку вида:

{"server_time":1520605826,"pairs":{"ltc_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"nmc_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"ppc_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"dash_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"doge_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"cam_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"cann_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"uro_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"opal_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"via_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"sdc_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"start_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"gsx_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"vtc_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"smbr_btc":{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2},"etco_btc":
...//
{"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2}}}

server_time вопросов нет. Но вот ltc_btc, nmc_btc и т.д. жутко неохота прописывать в классе, так как их повторюсь очень много. Возможно ли как то распарсить на массивы и желательно, что бы ltc_btc, nmc_btc и т.д. переписывались в string к остальным параметрам:

"decimal_places":8,"min_price":0.00000001,"max_price":10000,"min_amount":0.0001,"min_total":0.0001,"hidden":0,"fee":0.2,"fee_buyer":0.2,"fee_seller":0.2
Answer 1

Хоть вам и лень все это искать (а на эту тему на самом стаке ооочень много ответов), помогу вам все же...

Для начала, очень советую данный ресурс: тык. Также я буду в ответе использовать Json.net библиотеку.

Взглянем на структуру вашего JSON:

Мы видим, что в корне у нас есть некий long объект server_time и дальше идет некая коллекция pairs. В коллекции pairs мы видим неизвестное (динамичное) для нас имя некой подгруппы ltc_btc, внутри этой группы есть другие, интересующие нас объекты. Так, вроде бы разобрались, давайте создадим необходимую структуру данных и попробуем десериализовать JSON:

Создадим для начала простое, нашу категорию pairs:

public class Pair
    {
        [JsonProperty("decimal_places")]
        public long DecimalPlaces { get; set; }
        [JsonProperty("min_price")]
        public double MinPrice { get; set; }
        [JsonProperty("max_price")]
        public long MaxPrice { get; set; }
        [JsonProperty("min_amount")]
        public double MinAmount { get; set; }
        [JsonProperty("min_total")]
        public double MinTotal { get; set; }
        [JsonProperty("hidden")]
        public long Hidden { get; set; }
        [JsonProperty("fee")]
        public double Fee { get; set; }
        [JsonProperty("fee_buyer")]
        public double FeeBuyer { get; set; }
        [JsonProperty("fee_seller")]
        public double FeeSeller { get; set; }
    }

Здесь все просто, название класса Pair - ибо наша коллекция будет Pairs (множественное), один объект Pair. Далее каждое значение приведено к своему типу (long, double и др.), задавайте сразу верное значение!. Также можно заметить, что у каждого значения есть некий флаг JsonProperty, который указывает оригинальное имя объекта! Ведь не правильно в C# языке назвать переменную fee_seller, да и не красиво это. Ок, часть работы сделана.

Следующим шагом будет создание еще одного класса, который будет содержать в себе server_time и нашу коллекцию pairs, раз это корневой класс, давайте так и назовем его:

public class RootObject
{
    [JsonProperty("server_time")]
    public long ServerTime { get; set; }
    [JsonProperty("pairs")]
    public Dictionary<string, Pair> Pairs { get; set; }
}

Здесь вроде все понятно, имена (как и в классе Pair), пометки и все остальное. Интересное тут заключается в коллекции Pairs, как можно видеть, это словарь (Dictionary). При десериализации, под каждый ltc_btc, nmc_btc, opal_btc... мы получим своварь, который в ключе (key) будет хранить название нужного раздела (opal_btc к примеру), а в значение (value) будут "внутренности", в виде класса Pair.

Ну чтож, раз структура у нас есть, осталось сделать десериализацию:

var json = JsonConvert.DeserializeObject<RootObject>(jstring);

Ну тут прям совсем просто, мы в JSON (которой будет задан тип RootObject) десериализуем данные из полученной заранее string jstring переменной.

Все, теперь можно вывести необходимые данные:

  • Мы можем к примеру сделать поиск по ключу:

    var data = json.Pairs.FirstOrDefault(x => x.Key == "ltc_btc");
    Console.WriteLine($"Key: {data.Key} {data.Value.MaxPrice}");
  • А можем вывести все объекты сразу с помощью цикла:

    foreach (var pair in json.Pairs)
    {
        Console.WriteLine($"{pair.Key}, {pair.Value.MaxPrice}");
    }

Ну, надеюсь я вам помог. В дальнейшем, прошу вас не лениться и хотя бы немного попробуйте поискать информацию! Удачи!

READ ALSO
C# Api VkNet Не подключается

C# Api VkNet Не подключается

Вот такое выбивает при попытке подключить к проектуНичего не нашел в интернете! Что делать?

231
C# Передача данных из формы

C# Передача данных из формы

Передаю данные из первой формы во вторую Выдает ошибку: Ссылка на объект не указывает на экземпляр объекта

159
PostAsync файл MultiPartFormData с кириллическими символами

PostAsync файл MultiPartFormData с кириллическими символами

Пытаюсь отправить документ с кириллическими символами в названии через телеграм-бот:

167
Динамическое создание кнопок и работа с ними C#

Динамическое создание кнопок и работа с ними C#

Короче, суть в чем, я создаю кнопки на динамической форме и хочу чтобы у каждой кнопки было све нажатие или что-нибудь такое, по которому я смогу...

231