【发布时间】:2017-10-12 09:43:51
【问题描述】:
我正在序列化一个具有List<X> 和Dictionary<X, Y> 的对象。
List<X> 正在序列化,没有任何问题。
然而,为了序列化字典,我实现了一个自定义转换器。
class XYDictionaryConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Dictionary<X, Y>).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
Dictionary<X, Y> dictionary = new Dictionary<X, Y>();
foreach (JProperty property in jObject.Properties())
{
X key = //Get Y using property.Name
if (key != null)
{
dictionary.Add(key, property.Value.ToObject<Y>());
}
}
return dictionary;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
IDictionary<X, Y> dictionary = (IDictionary<X, Y>)value;
JObject jObject = new JObject();
foreach (var kvp in dictionary)
{
jObject.Add(kvp.Key.name, kvp.Value == null ? null : JToken.FromObject(kvp.Value));
}
jObject.WriteTo(writer);
}
}
问题是我不知道如何在转换器中引用List<X>。假设 JSON 是线性反序列化的,此时 List<X> 应该已经反序列化了,但是由于 DeserializeObject() 方法还没有完成,所以我没有任何参考。
我将如何解决这个问题?
【问题讨论】:
-
不知道你说的“转换器内的列表”是什么意思,你是说jObject吗?
-
我认为需要 property.Value 中的对象类型
-
@derloopkat 被反序列化的根对象由
DeserializeObject接收。在该类中是 List和 Dictionary 。问题是当它反序列化字典时,我无法访问列表。 -
内部,我的意思是“在转换期间”。
标签: c# json serialization