Передача Json информации в конструктор объекта при десериализации - PullRequest
0 голосов
/ 05 марта 2020

У меня есть Json файл, который состоит из вложенных сериализованных объектов.
При десериализации этого файла я восстанавливаю вложенный объект по мере необходимости, выполняя следующие действия:

var SomeNestedObjects= JsonConvert.DeserializeObject<SomeNestedObjectsFormat>(File.ReadAllText(@"e:\file.json"));

Теперь все отлично работает, потому что в моей системе есть определение всех этих вложенных объектов, и поэтому JsonConverter может создавать и инициализировать все, что находится в этом файле Json.

Что я хотел бы сделать, так это иметь пустой модуль, который будет построен / построен / заполнен во время выполнения на основе того, что находится в файле Json. Давайте возьмем следующий файл Json в качестве примера, содержащий 1 модуль, состоящий из 2 параметров:

{
  "Name": "DummyModule",
  "param1": {
    "Value": 456,
    "Name": "Param1",
    "MinValue": 0,
    "MaxValue": 500
  },
  "param2": {
    "Value": false,
    "Name": "Param2",
    "MinValue": false,
    "MaxValue": true
  }
}

Теперь в моей системе есть класс Parameter, но мой класс DummyModule ничего не знает о Param1 и Param2 , Причина в том, что этот DummyModule может состоять из чего угодно и может изменяться во время выполнения.

Итак, я хотел бы иметь возможность добавлять свойства в мой DummyModule во время выполнения, когда я читаю Json. Для того, чтобы сделать это, мне нужно было бы сделать несколько маги c в моем конструкторе DummyModule, основываясь на том, что это считывается из Json.
Проблема в том, что я не знаю, как мой конструктор может получить доступ или быть передал информацию о файле Json. Вот мой класс DummyModule ():

public class DummyModule
{
    public string Name { get; set; }

    [JsonConstructor]
    public DummyModule()
    {
        // Use Json Object here to create/add my "Param1" and "Param2" properties on the fly
        // ...

        // Something of the sort:       
        foreach (var param in jsonObject)
            CreateProperty(tb, param.FieldName, param.FieldType);
    }
}

1 Ответ

1 голос
/ 05 марта 2020

Если ваш объект не обязательно должен иметь тип DummyModule, вы можете использовать ExpandoObject в качестве типа назначения для десериализации JSON:

. Класс ExpandoObject позволяет добавлять и удалять элементы его экземпляров во время выполнения, а также устанавливать и получать значения этих элементов.

dynamic myObject = JsonConvert.DeserializeObject<ExpandoObject>(File.ReadAllText(@"e:\file.json"));

Console.WriteLine(myObject.Name);
Console.WriteLine(myObject.Name.GetType());

Console.WriteLine(myObject.param1.Value);
Console.WriteLine(myObject.param1.Value.GetType());

И это будет вывод:

enter image description here

...