Re[9]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 17.06.25 05:26
Оценка: 3 (1)
Здравствуйте, amironov79, Вы писали:

S>>"pairs": [ — скобка есть открывающая, а вот где закрывающая?

A>Так надо добавить закрывающую скобку, а не менять иерархию элементов.

Так вопрос в том как программно добавить [? Или же это опечатка автора и скобку программно добавлять не нужно?

Допустим это опечатка автора и автор не осилил задать правильный вопрос. Тогда JSON будет таким:

{
  "0": {
    "name": "Binance",
    "date_live": null,
    "url": "https://www.binance.com"
   },
  "1": {
    "name": "Gate",
    "date_live": null,
    "url": "https://gate.io/"
   },
  "pairs": [
    {
      "volume": 9434765.1817967,
      "price": 0.0587
    },
    {
      "volume": 9401647.3731512,
      "price": 2.0366
    }
  ]
}


Так?

Тогда GPT дает ответ:

using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace JsonParsingDemo
{
    // ---------- POCO classes ----------

    public sealed class Exchange
    {
        [JsonPropertyName("name")]
        public string name { get; init; }

        [JsonPropertyName("date_live")]
        public DateTime? dateLive { get; init; }

        [JsonPropertyName("url")]
        public string url { get; init; }
    }

    public sealed class Pair
    {
        [JsonPropertyName("volume")]
        public double volume { get; init; }

        [JsonPropertyName("price")]
        public double price { get; init; }
    }

    /// <summary>
    /// Root object: numeric keys go to otherProps; "pairs" → List&lt;Pair&gt;
    /// </summary>
    public sealed class Root
    {
        [JsonExtensionData]
        public Dictionary<string, JsonElement> otherProps { get; init; }

        [JsonPropertyName("pairs")]
        public List<Pair> pairs { get; init; }

        /// <summary>
        /// Convert numeric‑key properties into Exchange list.
        /// </summary>
        public IReadOnlyList<Exchange> GetExchanges()
        {
            var list = new List<Exchange>();

            foreach (var kvp in otherProps)
            {
                if (!int.TryParse(kvp.Key, out _))
                    continue;

                list.Add(kvp.Value.Deserialize<Exchange>());
            }

            return list;
        }
    }

    // ---------- Demo ----------

    internal static class Program
    {
        private static void Main()
        {
            // JSON literal.
            string json = """
            {
              "0": {
                "name": "Binance",
                "date_live": null,
                "url": "https://www.binance.com"
              },
              "1": {
                "name": "Gate",
                "date_live": null,
                "url": "https://gate.io/"
              },
              "pairs": [
                {
                  "volume": 9434765.1817967,
                  "price": 0.0587
                },
                {
                  "volume": 9401647.3731512,
                  "price": 2.0366
                }
              ]
            }
            """;

            var options = new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true
            };

            Root root = JsonSerializer.Deserialize<Root>(json, options);

            IReadOnlyList<Exchange> exchanges = root.GetExchanges();
            List<Pair> pairs = root.pairs;

            Console.WriteLine("Exchanges:");
            foreach (var ex in exchanges)
            {
                Console.WriteLine($"  {ex.name} → {ex.url}");
            }

            Console.WriteLine("\nPairs:");
            foreach (var p in pairs)
            {
                Console.WriteLine($"  volume: {p.volume}, price: {p.price}");
            }
        }
    }
}
=сначала спроси у GPT=
Re[10]: Как десериализовать?
От: amironov79  
Дата: 17.06.25 06:10
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Тогда GPT дает ответ:


Так похоже на правду Интересно, имя Exchange ты в промте задавал или оно по литералу "Binance" выведено было?
Re[11]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 17.06.25 06:45
Оценка: 2 (1)
Здравствуйте, amironov79, Вы писали:

S>>Тогда GPT дает ответ:

A>Так похоже на правду Интересно, имя Exchange ты в промте задавал или оно по литералу "Binance" выведено было?

Полный текст запроса в бесплатной версии:

C# — нужно распарсить такой JSON в объекты

{
"0": {
"name": "Binance",
"date_live": null,
"url": "https://www.binance.com"
},
"1": {
"name": "Gate",
"date_live": null,
"url": "https://gate.io/"
},
"pairs": [
{
"volume": 9434765.1817967,
"price": 0.0587
},
{
"volume": 9401647.3731512,
"price": 2.0366
}
]
}


и потом

дай полный код с парсингом из строки


По сути тут только знание документации нужно. А для более сложных вопросов — уже нужна o3
=сначала спроси у GPT=
Re[10]: Как десериализовать?
От: Passerby  
Дата: 19.06.25 21:45
Оценка:
Здравствуйте, Shmj, Вы писали:

Спасибо, то что надо. Чем здесь IReadOnlyList<Exchange> лучше List<Exchange>?
Re[11]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 20.06.25 01:33
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

P>Спасибо, то что надо. Чем здесь IReadOnlyList<Exchange> лучше List<Exchange>?


Емнип, это чисто Framework design guidelines: https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/guidelines-for-collections

❌ DO NOT use ArrayList or List<T> in public APIs.


Т.е. технически ничем не отличается, но по правилам хорошего тона — так принято.
=сначала спроси у GPT=
Отредактировано 20.06.2025 1:34 Shmj . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.