我正在使用一个返回(并期望)一些不寻常的格式JSON的Web服务。它不使用列表或字典,而是使用编号字段模式:
{
// 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>
属性序列化/反序列化。
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++;
}
}