{
"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;
}
Здравствуйте, 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;
}
Здравствуйте, Qulac, Вы писали: Q> public List<KeyValuePair<string, _0>> dic; //не работает
Не работает. Похоже на парсить строку вручную, т.к. чтобы ни было написано, в равно штатный десериализатор будет искать по имени, которое меняется. Или, может, есть возможность в атрибуте указать, что, к примеру, Dictionary<string, _0> dic(для него атрибут) применять для любого имени, кроме pairs.
Здравствуйте, Passerby, Вы писали:
P>Или, может, есть возможность в атрибуте указать, что, к примеру, Dictionary<string, _0> dic(для него атрибут) применять для любого имени, кроме pairs.
У System.Text.Json есть атрибут `JsonExtensionData`, но он вешается только на `Dictionary<string, JsonElement>`, поэтому потребуется дополнительная обработка. Ну либо писать свой JsonConverter для Root.
Здравствуйте, 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);
}
Здравствуйте, 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}");
}
}
}
Здравствуйте, 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>
Здравствуйте, Doom100500, Вы писали:
A>>У System.Text.Json есть атрибут `JsonExtensionData`, но он вешается только на `Dictionary<string, JsonElement>`, поэтому потребуется дополнительная обработка. Ну либо писать свой JsonConverter для Root.
D>У меня <string, object> работает .
Действительно, оказывается еще на JsonObject можно. Так что выбор есть
Здравствуйте, Shmj, Вы писали:
A>>Это решение другой задачи.
S>Тогда сформулируйте точный вопрос.
Я знаю решение и без гпты. Исходная задача достаточно понятно сформулирована в исходном сообщении. Если ты считаешь, что эта задача гпте под силу, то мог бы провести мастер-класс?
Здравствуйте, amironov79, Вы писали:
S>>Тогда сформулируйте точный вопрос. A>Я знаю решение и без гпты. Исходная задача достаточно понятно сформулирована в исходном сообщении. Если ты считаешь, что эта задача гпте под силу, то мог бы провести мастер-класс?
Вам нужно сказать что именно вы хотите получить без подразумеваний. Ваш вопрос — "Как десериализовать" и привели JSON. Вам дали код как десериализовать. Что еще нужно?
Учитесь точно формулировать вопросы — правильно сформулированный вопрос — это 50% пути к решению.
Здравствуйте, 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 — видимо сначала сделать его корректным?
Здравствуйте, 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": [ — скобка есть открывающая, а вот где закрывающая?
В JSON не может быть "висящих" элементов. У вас есть ключ "0" с объектом, а затем "pairs" как отдельный ключ, но они не находятся внутри одного общего объекта.
Лишняя запятая в последнем элементе массива pairs. После "price": 0.0587, и "price": 2.0366, — в обоих случаях запятая не должна стоять, если это последний элемент.
JSON должен быть одним объектом (или массивом) на верхнем уровне. У вас нет внешнего обёрточного объекта, объединяющего "0" и "pairs".
Опять же — давайте более четко формулировать вопросы. Если речь про парсинг некорректного JSON — то ответ очевиден — нужно привести его в корректное состояние.
Здравствуйте, Shmj, Вы писали:
S>"pairs": [ — скобка есть открывающая, а вот где закрывающая?
Так надо добавить закрывающую скобку, а не менять иерархию элементов. Если отсутствие закрывающей скобки не ошибка копирования, а реальный пример, тогда задача действительно стандартного решения не имеет.
S>Лишняя запятая в последнем элементе массива pairs. После "price": 0.0587, и "price": 2.0366, — в обоих случаях запятая не должна стоять, если это последний элемент.
Большинство парсеров висячую запятую поддерживают. У STJ для этого точно есть опция.
S>JSON должен быть одним объектом (или массивом) на верхнем уровне. У вас нет внешнего обёрточного объекта, объединяющего "0" и "pairs".
S>Опять же — давайте более четко формулировать вопросы. Если речь про парсинг некорректного JSON — то ответ очевиден — нужно привести его в корректное состояние.
Вопрос был не как привести json к каноническому виду, а как разобрать существующий, на структуру которого скорее всего невозможно повлиять.