1

Тема: Структура даних для конфігурації

Підкажіть, будь ласка, мені, відносному початківцю, як найкраще створити такий файл-структуру, на кшталт php-шних асоціативних масивів з конфігурацією:

return [
    'item1' => 'value1',
    'item2' => 'value2',
    'section3' => [
        'item3.1' => 'value3.1'
        'item3.2' => 'value3.2'
    ]
];

Або файлів у форматі json:

{
    "item1": "value1",
    "item2": 'value2",
    "section3": {
        "item3.1": "value3.1",
        "item3.2": "value3.2"
    }
}

І як з таким файлом-структурою працювати? Щось поки що мені нічого на думку не спадає...

2

Re: Структура даних для конфігурації

JSON в .NET

Подякували: Chemist-i, bvn, cheappi3863

3

Re: Структура даних для конфігурації

Якщо вам потрібно саме конфігурувати програму, то бажано використовувати призначені для цього конфігураційні файли
в .Net 4.x це будуть спеціальні app.config або web.config файли з XML подібною структурою. Гугліть клас ConfigurationManager для роботи з конфігурацією.

в .Net Сore гугліть IConfiguration для роботи з конфігурацією в JSON-подібному форматі. Також клас Startup, метод Configure

Якщо ж вас цікавить в загальному, як зберегти дані в структурований файл то гугліть про серіалізацію в .Net. Це може бути XML, JSON або й інші формати

Подякували: leofun01, bvn2

4

Re: Структура даних для конфігурації

leofun01 написав:

JSON в .NET

Наче б то те, що треба, але... там в прикладах використовується заздалегідь описаний клас для серіалізації/десеріалізації. Але я заздалегідь не знаю, яка буде структура того файлу - від повністю динамічний.

Я спробував зробити так:

string jsonString = File.ReadAllText("Defs/pentaminos.json");
object config = JsonSerializer.Deserialize<object>(jsonString);

І це наче б то спрацювало, бо коли я роблю

Console.WriteLine(config);

то воно компілюється і запускається, а в консолі vscode я бачу вказану структуру у вигляді схожому на json.

Але тут встає наступне питання, як мені звернутися до членів того об'єкту? Я вже мовчу про те, щоб з'ясувати, а які саме члени доступні (адже структура заздалегідь не визначена).

Коли спробував зробити щось таке:

Console.WriteLine(config.O1);

(для тестових цілей я відкинув вимогу про динамічність структури і я точно знаю, що такий елемент є), то я отримав:

error CS1061: 'object' does not contain a definition for 'O1' and no accessible extension method 'O1' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) [/home/*/mono/My004/My004.csproj]

Ото я після оцих спроб осягти науку C# все більше і більше починаю любити PHP за такий потужний інструмент, як асоціативні масиви... і навіть до javascript`у почав відноситись з більшою повагою за його JSO.

Цікаво як люди працюють на C# з mongo, наприклад?

5 Востаннє редагувалося Engineer (25.12.2020 00:40:24)

Re: Структура даних для конфігурації

Для початку питання : звідки ви знаєте по члена об'єкту O1, якщо самі пишете, що "заздалегідь не знаю, яка буде структура того файлу" А тут вже раптом знаєте, що є член O1

А якщо він відомий на етапі розробки, то його можна описати в класі (e.g. MyClass), що містить потрібні вам члени класу і привести отриманий після десеріалізації об`єкт типу оbject до типу MyClass ( підказка - читати про приведення типів в C#)
або ще краще, відразу в коді зробити ось так

MyClass config = JsonSerializer.Deserialize<MyClass>(jsonString);
Подякували: leofun011

6 Востаннє редагувалося bvn (25.12.2020 01:23:22)

Re: Структура даних для конфігурації

Engineer написав:

Для початку питання : звідки ви знаєте по члена об'єкту O1, якщо самі пишете, що "заздалегідь не знаю, яка буде структура того файлу" А тут вже раптом знаєте, що є член O1

Я ж написав, що для тестових цілей, я припустив, що файл статичний і я знаю, що в ньому є такий член. Звісно в тестовому файлі він є.

Шкода, що саме на моє запитання ви нічого й не відповіли...

7

Re: Структура даних для конфігурації

bvn написав:
Engineer написав:

Для початку питання : звідки ви знаєте по члена об'єкту O1, якщо самі пишете, що "заздалегідь не знаю, яка буде структура того файлу" А тут вже раптом знаєте, що є член O1

Я ж написав, що для тестових цілей, я припустив, що файл статичний і я знаю, що в ньому є такий член. Звісно в тестовому файлі він є.

Шкода, що саме на моє запитання ви нічого й не відповіли...

Про що не відповів - про роботу з Mongo в С# ?
Соррі, не працював

А смисл десеріалізувати файл невідомої динамічної структури ?! Який практичний смисл цієї роботи ?

Подякували: leofun011

8 Востаннє редагувалося bvn (25.12.2020 02:23:32)

Re: Структура даних для конфігурації

Engineer написав:

Про що не відповів - про роботу з Mongo в С# ?
Соррі, не працював

А смисл десеріалізувати файл невідомої динамічної структури ?! Який практичний смисл цієї роботи ?

Оце жутко не люблю оце запитання. Коли відповіді нема, всі починають намагатися виправити постановку задачі.

Ну, от смисл як раз - це розпарсити відповідь mongo-сервера... наприклад.

Добре, я скажу, про свою задачу. Так, вона дещо умоглядна, однак, подібні ситуації я неодноразово використовував у PHP-проектах, де є певний конфіг, подібний до того, що я описав у першому дописі. Гіпотетично, ми можем знати, що в конфігу можуть бути такі і тільки такі опції, а якихось інших не може бути, хоча є безліч ситуацій, коли це не справджується. Наприклад, конфіг підключень до баз даних, де люди додають записи з певним вигаданим ім'ям, а в ньому параметри того з'єднання. Потім за тим ім'ям використовуються ці з'єднання в коді програми. Тож ми не можемо заздалегідь знати, які ім'я будуть в тих з'єднань.

От, а коли подивитися про назву мого файлу "pentaminos.json" то про що тут йдеться, там під різними іменами йдуть описи різних фігур для гри типу Пентаміно. Я хотів, щоб користувач міг сам додати ті фігури, які він захоче і назвати їх так, як захоче, а потім перед початком гри, вибрати зі списку. Чим погана задача?

Так, напевне, можна зараз щось почати перекручувати, щоб вирішити конкретно ту чи іншу задачу, але мені от хотілося б знайти рішення саме такої абстрактної задачи: "зчитати конфіг у певному структурованому форматі, де рівень вкладенності може бути більший за 1, а потім розпарсити той конфіг і зчитати всі необхідні дані звідти". Чому ні? Навіщо треба знати конкретне застосування, коли сама по собі задача цілком притомна і має місце бути?

9 Востаннє редагувалося cheappi386 (25.12.2020 16:52:30)

Re: Структура даних для конфігурації

Все одно доведеться - фрагментувати динамічну структуру до незмінних базових елементів, а вже масиви таких елементів можна серіалізувати.
PS: ви що намагаєтеся сереалізувати дерево ?

Подякували: Engineer1

10 Востаннє редагувалося bvn (25.12.2020 17:23:48)

Re: Структура даних для конфігурації

Шкода, що немає засобів, щоб враз вирішити мою проблему. Імовірно для задачі з пентаміно цілком досить було б описати класс конфігурації того довбаного елемента пентаміно, а потім описати це як Dictionary<string, PentaminoElement> і мабуть таким чином десеріалізувати... але мене вже приципово цікавить вирішення глобально абстрактної задачі: десеріалізації дерева конфігурації.

Звісно для цього швидше за все знадобиться писати якийсь свій десеріалізатор... читай парсер того джейсону як рядка... гммм, може тоді вже краще обрати yaml з відступами... Подумаю.

11

Re: Структура даних для конфігурації

Якщо так принципово, то по дивіться ще такі штуки в  С#,  як кортежі або   Tuple. Може вам підійде. От тільки чи серіалізується воно в Json і навпаки, не знаю.

Подякували: bvn1

12

Re: Структура даних для конфігурації

Ну і для конкретного випадку з грою - чому б не зробити отого  string Name членом класу для десеріалізації?

13 Востаннє редагувалося bvn (25.12.2020 17:48:21)

Re: Структура даних для конфігурації

Engineer написав:

Якщо так принципово, то по дивіться ще такі штуки в  С#,  як кортежі або   Tuple. Може вам підійде. От тільки чи серіалізується воно в Json і навпаки, не знаю.

Так. Перше чим треба озадачитись, це кінцева структура, в якій воно має зберігатися. А потім вже думати, як його туди з того джейсону перегнати.