【发布时间】:2017-01-09 00:04:28
【问题描述】:
序列化时,我将 ClassName 写入对象到 _CurrentClassName 属性中。当使用 JSON.Net 库读取 json 时,我需要将对象更改为该属性的值。
{
"Field1": 0,
"Field2": "34",
"_CurrentClassName": "MyCustomClass"
}
class CustomJsonConverter : JsonConverter
{
...
public override bool CanConvert(Type objectType)
{
return objectType.IsClass;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = existingValue;
if (reader.TokenType == JsonToken.Null)
{
return null;
}
else if (reader.TokenType == JsonToken.StartObject)
{
JObject jObject = JObject.Load(reader);
JToken jToken;
if (jObject.TryGetValue("_CurrentClassName", out jToken))
{
var t = jToken.Value<string>();
Type tt = Type.GetType(objectType.Namespace + "." + t);
value = Activator.CreateInstance(tt);
return value;
}
}
return serializer.Deserialize(reader);
}
...
}
【问题讨论】:
-
您可以做类似于Json.Net Serialization of Type with Polymorphic Child Object 的回答中所做的事情。
-
谢谢。类似,但我不能使用“硬”类型,我的 CanConvert 看起来像: public override bool CanConvert(Type objectType) { return objectType.IsClass; }
-
您是否与该属性名称和语法结婚,或者您可以使用内置的 Json.Net 来处理这个?
-
如果您将
new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }传递给序列化或反序列化方法,您将添加类似$"type": "Namespace.Type, Assembly"的属性。
标签: c# .net serialization json.net