Сериализация и десериализация индексированных имен полей в списке - PullRequest
0 голосов
/ 17 января 2019

Я работаю с веб-сервисом, который возвращает (и ожидает) какой-то необычный сформированный JSON. Вместо использования списка или словаря используется шаблон нумерованного поля:

{
    // some normal fields
    "col0" : "First column name",
    "val0" : "First value",
    "col1" : "Second column name",
    "val1" : "Second value",
    // ...
    "coln" : "n-th column name",
    "valn" : "n-th value"
} 

Я хочу сериализовать / десериализовать эти значения в / из свойства Dictionary<string, string>, используя json.net.

1 Ответ

0 голосов
/ 17 января 2019

json.net предоставляет механизм десериализации дополнительных свойств. Чтобы использовать его, введите личное свойство и пометьте его JsonExtensionDataAttribute, чтобы дать десериализатору команду хранить все свойства, которые не могут быть отображены в словаре. Если тип сериализован, все значения в этом словаре также сохраняются. Заполнить словарь расширения соотв. общедоступный словарь вы можете использовать OnDeserialized соотв. OnSerializing обратные вызовы.

[JsonIgnore]
public Dictionary < string, string > Columns {get;} = new Dictionary <string, string>();

[JsonExtensionData()]
private Dictionary < string, JToken > _additionalData {get; set;}

[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
    int i = 0;
    while (_additionalData.TryGetValue($ "col{i}", out JToken column))
    {
        var value = _additionalData[$ "val{i}"];
        Columns.Add(column.ToObject < string > (), value.ToObject < string > ());
        i++;
    }
}

[OnSerializing]
private void OnSerializing(StreamingContext context)
{
    int i = 0;
    _additionalData = new Dictionary < string, JToken > ();
    foreach(var item in Columns)
    {
        _additionalData.Add($ "col{i}", item.Key);
        _additionalData.Add($ "val{i}", item.Value);
        i++;
    }
}
...