Как десериализовать?
От: Passerby  
Дата: 10.06.25 11:54
Оценка:
Как десериализовать?
{
  "0": {//кроме 0 есть и другие числа в в этой строке для других запросов. Как десериализовать? public Dictionary<string, _0> dic; не работает.
    "name": "Binance",
    "date_live": null,
    "url": "https://www.binance.com"
  },
  "pairs": [
    {      
      "volume": 9434765.1817967,
      "price": 0.0587,      
    },
    {     
      "volume": 9401647.3731512,
      "price": 2.0366,      
    }
}


public class _0
{
    public string name;
    public object date_live;
    public string url;
}

public class Pair
{    
    public double volume;
    public double price;    
}

public class Root
{
    public Dictionary<string, _0> dic;  //не работает
    public List<Pair> pairs;
}
Отредактировано 10.06.2025 22:58 VladD2 . Предыдущая версия .
Re: Как десериализовать?
От: Qulac Россия  
Дата: 10.06.25 12:15
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Как десериализовать?

P>{
P> "0": {//кроме 0 есть и другие числа в в этой строке для других запросов. Как десериализовать? public Dictionary<string, _0> dic; не работает.
P> "name": "Binance",
P> "date_live": null,
P> "url": "https://www.binance.com"
P> },
P> "pairs": [
P> {
P> "volume": 9434765.1817967,
P> "price": 0.0587,
P> },
P> {
P> "volume": 9401647.3731512,
P> "price": 2.0366,
P> }
P>}

P>public class _0

P>{
P> public string name;
P> public object date_live;
P> public string url;
P>}

P>public class Pair

P>{
P> public double volume;
P> public double price;
P>}

P>public class Root

P>{
P> public Dictionary<string, _0> dic; //не работает
P> public List<Pair> pairs;
P>}

Может так:

public class Root
{
    public List<KeyValuePair<string, _0>> dic;  //не работает
    public List<Pair> pairs;
}

Программа – это мысли спрессованные в код
Re[2]: Как десериализовать?
От: Passerby  
Дата: 10.06.25 13:41
Оценка: 1 (1)
Здравствуйте, Qulac, Вы писали:
Q> public List<KeyValuePair<string, _0>> dic; //не работает

Не работает. Похоже на парсить строку вручную, т.к. чтобы ни было написано, в равно штатный десериализатор будет искать по имени, которое меняется. Или, может, есть возможность в атрибуте указать, что, к примеру, Dictionary<string, _0> dic(для него атрибут) применять для любого имени, кроме pairs.
Отредактировано 10.06.2025 14:32 Passerby . Предыдущая версия .
Re[3]: Как десериализовать?
От: amironov79  
Дата: 11.06.25 09:14
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Или, может, есть возможность в атрибуте указать, что, к примеру, Dictionary<string, _0> dic(для него атрибут) применять для любого имени, кроме pairs.


У System.Text.Json есть атрибут `JsonExtensionData`, но он вешается только на `Dictionary<string, JsonElement>`, поэтому потребуется дополнительная обработка. Ну либо писать свой JsonConverter для Root.
Re[4]: Как десериализовать?
От: Doom100500 Израиль  
Дата: 11.06.25 13:37
Оценка:
Здравствуйте, amironov79, Вы писали:

A>Здравствуйте, Passerby, Вы писали:


P>>Или, может, есть возможность в атрибуте указать, что, к примеру, Dictionary<string, _0> dic(для него атрибут) применять для любого имени, кроме pairs.


A>У System.Text.Json есть атрибут `JsonExtensionData`, но он вешается только на `Dictionary<string, JsonElement>`, поэтому потребуется дополнительная обработка. Ну либо писать свой JsonConverter для Root.


У меня <string, object> работает .
Вот мой AnyEntity:
    internal class AnyEntity
    {
        public AnyEntity() => Data = new Dictionary<string, object>();

        [JsonExtensionData]
        public Dictionary<string, object> Data { get; protected set; }
        public AnyEntity SetValue<T>(T value, [CallerMemberName] string key = null)
        {
            if (value == null)
                ResetKey(key);
            else
                Data[key] = value;
            return this;
        }
        public T GetValue<T>([CallerMemberName] string key = null) => Data.ContainsKey(key) ? (T)Data[key] : default;
        private void ResetKey(string key)
        {
            if (Data.ContainsKey(key))
                Data.Remove(key);
        }
    }

// Использованние:

    internal class SomeEntity: AnyEntity
    {
       [JsonIgnore]
        public string FooBar
        {
            get => GetValue<string>();
            set => SetValue(value);
        }
Спасибо за внимание
Re[5]: Как десериализовать?
От: Passerby  
Дата: 11.06.25 18:28
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>У меня <string, object> работает .

Можете код показать, как тестировали?
SomeEntity r = null;
try
{
    r = JsonSerializer.Deserialize<SomeEntity>(message, jsonOptions);   
}
catch (Exception e) { }


У меня Data.Count=0;
Re: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 11.06.25 21:10
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Как десериализовать?

P>
P>{
P>  "0": {//кроме 0 есть и другие числа в в этой строке для других запросов. Как десериализовать? public Dictionary<string, _0> dic; не работает.
P>    "name": "Binance",
P>    "date_live": null,
P>    "url": "https://www.binance.com"
P>  },
P>  "pairs": [
P>    {      
P>      "volume": 9434765.1817967,
P>      "price": 0.0587,      
P>    },
P>    {     
P>      "volume": 9401647.3731512,
P>      "price": 2.0366,      
P>    }
P>}
P>


Ответ бесплатного GPT не подходит разве?

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

public class Exchange
{
    public string name { get; set; }
    public DateTime? date_live { get; set; }
    public string url { get; set; }
    public List<Pair> pairs { get; set; }
}

public class Pair
{
    public double volume { get; set; }
    public double price { get; set; }
}

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

        var exchanges = JsonSerializer.Deserialize<Dictionary<string, Exchange>>(json);

        foreach (var kvp in exchanges)
        {
            Console.WriteLine($"Exchange ID: {kvp.Key}");
            Console.WriteLine($"Name: {kvp.Value.name}");
            Console.WriteLine($"URL: {kvp.Value.url}");
            Console.WriteLine("Pairs:");
            foreach (var pair in kvp.Value.pairs)
                Console.WriteLine($"  Volume: {pair.volume}, Price: {pair.price}");
        }
    }
}
=сначала спроси у GPT=
Отредактировано 11.06.2025 21:26 Shmj . Предыдущая версия .
Re[6]: Как десериализовать?
От: Doom100500 Израиль  
Дата: 12.06.25 05:25
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Здравствуйте, Doom100500, Вы писали:


D>>У меня <string, object> работает .

P>Можете код показать, как тестировали?
P>
P>SomeEntity r = null;
P>try
P>{
P>    r = JsonSerializer.Deserialize<SomeEntity>(message, jsonOptions);   
P>}
P>catch (Exception e) { }
P>


P>У меня Data.Count=0;


Не могу. Этим занимается StreamJsonRpc (by Microsoft) где-то здесь https://github.com/microsoft/vs-streamjsonrpc/blob/be5ecf96a0ae7b982ee737b56b3b940607e797c4/src/StreamJsonRpc/SystemTextJsonFormatter.cs#L87.

PS: Ага JsonDocument.Parse вызывают
Спасибо за внимание
Re[5]: Как десериализовать?
От: amironov79  
Дата: 16.06.25 10:33
Оценка:
Здравствуйте, Doom100500, Вы писали:

A>>У System.Text.Json есть атрибут `JsonExtensionData`, но он вешается только на `Dictionary<string, JsonElement>`, поэтому потребуется дополнительная обработка. Ну либо писать свой JsonConverter для Root.


D>У меня <string, object> работает .


Действительно, оказывается еще на JsonObject можно. Так что выбор есть
Re[2]: Как десериализовать?
От: amironov79  
Дата: 16.06.25 10:35
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ответ бесплатного GPT не подходит разве?


Это решение другой задачи.
Re[6]: Как десериализовать?
От: amironov79  
Дата: 16.06.25 11:23
Оценка: +1
Здравствуйте, Passerby, Вы писали:

P>У меня Data.Count=0;


Возможно, из-за того что используются поля. Надо либо перейти на свойства, либо добавить в опции IncludeFields = true.
Re[3]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 16.06.25 13:01
Оценка:
Здравствуйте, amironov79, Вы писали:

S>>Ответ бесплатного GPT не подходит разве?

A>Это решение другой задачи.

Тогда сформулируйте точный вопрос.
=сначала спроси у GPT=
Re[4]: Как десериализовать?
От: amironov79  
Дата: 16.06.25 16:51
Оценка:
Здравствуйте, Shmj, Вы писали:

A>>Это решение другой задачи.


S>Тогда сформулируйте точный вопрос.


Я знаю решение и без гпты. Исходная задача достаточно понятно сформулирована в исходном сообщении. Если ты считаешь, что эта задача гпте под силу, то мог бы провести мастер-класс?
Re: Как десериализовать?
От: pilgrim_ Россия  
Дата: 16.06.25 16:57
Оценка: -1
Здравствуйте, Passerby, Вы писали:

P>Как десериализовать?

P>
P>public class Root
P>{
P>    public Dictionary<string, _0> dic;  //не работает
P>    public List<Pair> pairs;
P>}
P>


Про JsonExtensionDataAttribute уже сказали, вот тут пишут как его использовать.
Твой пример:

    public class Root
    {
        [JsonInclude]
        [JsonExtensionData]
        private Dictionary<string, JsonElement> _rawData { get; set; }
        
        public List<Pair> pairs { get; set; }
        
        private Dictionary<string, _0> _dic;
        [JsonIgnore]
        public Dictionary<string, _0> dic => _dic ?? (_dic = _rawData?.ToDictionary(p => p.Key, p => p.Value.Deserialize<_0>(JsonSerializerOptions.Default)));
    }
Re[5]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 16.06.25 17:07
Оценка: :)))
Здравствуйте, amironov79, Вы писали:

S>>Тогда сформулируйте точный вопрос.

A>Я знаю решение и без гпты. Исходная задача достаточно понятно сформулирована в исходном сообщении. Если ты считаешь, что эта задача гпте под силу, то мог бы провести мастер-класс?

Вам нужно сказать что именно вы хотите получить без подразумеваний. Ваш вопрос — "Как десериализовать" и привели JSON. Вам дали код как десериализовать. Что еще нужно?

Учитесь точно формулировать вопросы — правильно сформулированный вопрос — это 50% пути к решению.
=сначала спроси у GPT=
Re[6]: Как десериализовать?
От: pilgrim_ Россия  
Дата: 16.06.25 18:46
Оценка: +1 -1
Здравствуйте, Shmj, Вы писали:

S>Ваш вопрос — "Как десериализовать" и привели JSON. Вам дали код как десериализовать.


Только этот код десериализует не тот JSON, который привёл ТС.

S>Что еще нужно?


Внимательно посмотреть на искомый JSON.
Re[6]: Как десериализовать?
От: amironov79  
Дата: 17.06.25 03:36
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Учитесь точно формулировать вопросы — правильно сформулированный вопрос — это 50% пути к решению.


Учитесь замечать галлюцинации гпт Без этого навыка она вообще бесполезна.
Re[7]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 17.06.25 03:47
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Только этот код десериализует не тот JSON, который привёл ТС.

_>Внимательно посмотреть на искомый JSON.


{
  "0": {//кроме 0 есть и другие числа в в этой строке для других запросов. Как десериализовать? public Dictionary<string, _0> dic; не работает.
    "name": "Binance",
    "date_live": null,
    "url": "https://www.binance.com"
  },
  "pairs": [
    {      
      "volume": 9434765.1817967,
      "price": 0.0587,      
    },
    {     
      "volume": 9401647.3731512,
      "price": 2.0366,      
    }
}


А где тут закрывающая скобка [ — он же не корректный.

Опять таки к постановке вопроса — если речь о том как парсить некорректный JSON — видимо сначала сделать его корректным?
=сначала спроси у GPT=
Re[7]: Как десериализовать?
От: Shmj Ниоткуда  
Дата: 17.06.25 03:51
Оценка:
Здравствуйте, amironov79, Вы писали:

A>Учитесь замечать галлюцинации гпт Без этого навыка она вообще бесполезна.


Вы заметили что изначальный JSON не корректен:

{
  "0": {//кроме 0 есть и другие числа в в этой строке для других запросов. Как десериализовать? public Dictionary<string, _0> dic; не работает.
    "name": "Binance",
    "date_live": null,
    "url": "https://www.binance.com"
  },
  "pairs": [
    {      
      "volume": 9434765.1817967,
      "price": 0.0587,      
    },
    {     
      "volume": 9401647.3731512,
      "price": 2.0366,      
    }
}


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

  1. В JSON не может быть "висящих" элементов. У вас есть ключ "0" с объектом, а затем "pairs" как отдельный ключ, но они не находятся внутри одного общего объекта.

  2. Лишняя запятая в последнем элементе массива pairs. После "price": 0.0587, и "price": 2.0366, — в обоих случаях запятая не должна стоять, если это последний элемент.

  3. JSON должен быть одним объектом (или массивом) на верхнем уровне. У вас нет внешнего обёрточного объекта, объединяющего "0" и "pairs".


Опять же — давайте более четко формулировать вопросы. Если речь про парсинг некорректного JSON — то ответ очевиден — нужно привести его в корректное состояние.
=сначала спроси у GPT=
Re[8]: Как десериализовать?
От: amironov79  
Дата: 17.06.25 05:15
Оценка:
Здравствуйте, Shmj, Вы писали:

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


Так надо добавить закрывающую скобку, а не менять иерархию элементов. Если отсутствие закрывающей скобки не ошибка копирования, а реальный пример, тогда задача действительно стандартного решения не имеет.

S>Лишняя запятая в последнем элементе массива pairs. После "price": 0.0587, и "price": 2.0366, — в обоих случаях запятая не должна стоять, если это последний элемент.


Большинство парсеров висячую запятую поддерживают. У STJ для этого точно есть опция.

S>JSON должен быть одним объектом (или массивом) на верхнем уровне. У вас нет внешнего обёрточного объекта, объединяющего "0" и "pairs".


S>Опять же — давайте более четко формулировать вопросы. Если речь про парсинг некорректного JSON — то ответ очевиден — нужно привести его в корректное состояние.


Вопрос был не как привести json к каноническому виду, а как разобрать существующий, на структуру которого скорее всего невозможно повлиять.
Отредактировано 17.06.2025 5:19 amironov79 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.