序列化和反序列化索引字段名称以列出

时间:2019-01-17 02:11:22

标签: c# json serialization json.net deserialization

我正在使用一个Web服务,该服务返回(并期望)一些不正常的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"
} 

我想使用json.net在Dictionary<string, string>属性中对这些值进行序列化/反序列化。

1 个答案:

答案 0 :(得分:2)

json.net提供了一种反序列化其他属性的机制。要使用它,请引入一个私有属性,并用JsonExtensionDataAttribute进行标记,以指示反序列化器存储所有不能在theese词典中映射的属性。如果类型已序列化,则还将存储此字典中的所有值。要填充扩展字典,请分别输入。您可以使用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++;
    }
}