1 Востаннє редагувалося Betterthanyou (23.11.2022 13:54:23)

Тема: Замінити JSON Array в JSON файлі

Є JSON файл в якому структура може змінюватися в залежності від версії програми яка з JSON файлом працює. Тобто модель складно створити, потрібно парсити в динамічний об'єкт/контейнер (як наприклад dictionary/ExpandoObject)

хто не зрозумів

Є дві програми "клієнт" і "сервер". Клієнт формує JSON файл і відправляє на сервер.
А мені потрібно зробити третю програму, яка замінить дещо в цьому JSON файлі, і тоді відправить на сервер.
Тому я не можу знати яка структура JSON, вона може змінитися. Я тільки знаю що одне значення не змінюється. Це exchange->pair_whitelist. Це значення завжди існує в JSON

Відомо те, що в цьому JSON файлі є exchange->pair_whitelist масив. Його потрібно замінити та зберегти файл (не змінюючи інших властивостей JSON)

Питання: як це зробити ?

Ось я динамічно розпарсив JSON

public static dynamic GetJSONFromFile_dynamic(string path)
        {
            var data = File.ReadAllText(path);
            return JsonSerializer.Deserialize<ExpandoObject>(data);
        }

Можу добратися до exchange

var config = GetJSONFromFile_dynamic(<ШЛЯХ_ДО_JSON_ФАЙЛУ>);
dynamic a = config.exchange;

А ось до exchange.pair_whitelist - ні. Помилка "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''System.Text.Json.JsonElement' does not contain a definition for 'pair_whitelist''"

var config = GetJSONFromFile_dynamic(<ШЛЯХ_ДО_JSON_ФАЙЛУ>);
dynamic a = config.exchange.pair_whitelist;

Як замінити в JSON файлі, по такому шляху exchange->pair_whitelist, масив ?

2 Востаннє редагувалося frz (23.11.2022 13:57:55)

Re: Замінити JSON Array в JSON файлі

(некомпетентний в C# / .NET, але багато працював з JSON)

З мого відносно великого досвіду (робив це в Python + SQL), JSON потрібно формувати з нуля в такому вигляді який для вас бажаний. Розпарсити спершу, далі для всіх елементів формувати окремі змінні і якщо типи елементів повторюються, тоді робити це в циклі; саме значення конкретної змінної можна буде замінити.

Єдине що можна зробити саме заміною тексту - це спершу перетворити JSON на текст і користуватися чимось на зразок replace з SQL, якщо наперед відомий "дослівний" текст який потрібно замінити на інший. Після цих маніпуляцій обов'язково пробувати (try ... catch) парсити результуючий JSON аби переконатися, що він валідний.

3

Re: Замінити JSON Array в JSON файлі

var json = @"{
""exchange"":{
    ""pair_whitelist"": [
          ""EOS3S/USDT"",
          ""ACH/USDT"",
          ""SOC/USDT""]
    }
}";
var node = JsonNode.Parse(json);
node["exchange"]["pair_whitelist"] = new JsonArray("SKM/USDT", "NEW/USDT", "XEC/USDT");

var newJson = node.ToJsonString();
JObject jObject = JObject.Parse(File.ReadAllText(path_to_JSON_file));

if(jObject["exchange"]?["pair_whitelist"] != null) //Check key exists before update
     jObject["exchange"]["pair_whitelist"] = ["Stack", "Overflow"];