десериализация JSON-файла в класс, содержащий словарь с динамическим ключом - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь десериализовать файл JSON для объекта в c #, который имеет структуру, немного отличающуюся от самого файла, с помощью Newtonsoft.

Файл структурирован следующим образом:

PointProperty:
{
    "DataPointType": Foo
    "PointTypeProperties: [
          {
               "PropertyName":
               "PropertyValue":
               "Requirement":
          },
          etc.
     ]
}

Я пытаюсь сериализовать файл JSON в класс PointProperty и PointTypeProperty:

    public class PointProperty
    {
        public string DataPointType { get; set; }

        public Dictionary<String,PointTypeProperty> PointTypeProperties { get; set; }
    }

    public class PointTypeProperty
    {
        public string PropertyValue { get; set; }
        public string Requirement { get; set; }

    }

Таким образом, ключом к словарю PointTypeProperties будет PropertyName в файле JSON.Есть ли способ сделать это с помощью специального десериализатора?

Например:

PointProperty:
{
    "DataPointType": Alarm
    "PointTypeProperties: [
          {
               "PropertyName": AlarmCheck
               "PropertyValue": False
               "Requirement": Mandatory
          },
          etc.
     ]
}

Будет десериализован в такие классы, как:

``

public class PointTypeProperty
{
    public string PropertyValue = False
    public string Requirement = Mandatory

}

public class PointProperty
{
    public string DataPointType = Alarm

    public Dictionary<String,PointTypeProperty> PointTypeProperties = {"AlarmCheck": PointTypeProperty}
}

1 Ответ

0 голосов
/ 28 июня 2019

Вам не нужен пользовательский сериализатор. Вы можете использовать DTO, который вы можете легко преобразовать в свой класс.

PointTypeProperties логически является массивом в JSON, поэтому создайте DTO, который моделирует этот массив:

public class PointPropertyDto
{
    public string DataPointType { get; set; }
    public PointTypePropertyDto[] PointTypeProperties { get; set; }
}

public class PointTypePropertyDto
{
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
    public string Requirement { get; set; }
}

Вместо этого десериализуйте JSON в граф DTO:

string json = @"
{
    ""DataPointType"": ""Foo"",
    ""PointTypeProperties"": [
          {
               ""PropertyName"": ""Some name"",
               ""PropertyValue"": ""Some value"",
               ""Requirement"": ""Some requirement""
          }
     ]
}";

var deserializedDto = JsonConvert.DeserializeObject<PointPropertyDto>(json);

Затем перейдите из DTO в исходный класс:

var deserialized = new PointProperty
{
    DataPointType = deserializedDto.DataPointType,
    PointTypeProperties = deserializedDto.PointTypeProperties.ToDictionary(p => p.PropertyName, p =>
        new PointTypeProperty
        {
            PropertyValue = p.PropertyValue,
            Requirement = p.Requirement
        })
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...