C# 自定义JsonConverter作为属性
我试图弄清楚如何使用自定义JsonConverter作为属性。问题是,我不知道如何在转换器中获取FOO对象 范例C# 自定义JsonConverter作为属性,c#,json.net,C#,Json.net,我试图弄清楚如何使用自定义JsonConverter作为属性。问题是,我不知道如何在转换器中获取FOO对象 范例 [Newtonsoft.Json.JsonConverter(typeof(FOOConverter))] public interface IFOO { ... } public class FOOConverter : Newtonsoft.Json.JsonConverter { public override object ReadJson(JsonRea
[Newtonsoft.Json.JsonConverter(typeof(FOOConverter))]
public interface IFOO
{
...
}
public class FOOConverter : Newtonsoft.Json.JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jobj = serializer.Deserialize<JObject>(reader);
...
var foo = jobj.ToObject<IFOO>() // Calls the converter again?
}
}
[Newtonsoft.Json.JsonConverter(typeof(FOOConverter))]
公共接口IFOO
{
...
}
公共类FOOConverter:Newtonsoft.Json.JsonConverter
{
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var jobj=序列化程序。反序列化(读取器);
...
var foo=jobj.ToObject()//是否再次调用转换器?
}
}
.ToObject()将再次运行转换器并导致堆栈溢出,这是有意义的,因为它会查看属性,但是如何才能获取IFOO对象呢
编辑:WriteJson将是同步的,但带有JObject.FromObject(值)
使用需要灵活,例如:某些属性可能在序列化期间被加密/加密,其他情况下,可能需要缓存属性值。考虑几个用例。JSON类:
[KnownType(typeof(B))]
public class A
{
public string Name { get; set; }
}
public class B : A
{
public string LastName { get; set; }
}
转换器代码:
public class KnownTypeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return System.Attribute.GetCustomAttributes(objectType).Any(v => v is KnownTypeAttribute);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Load JObject from stream
JObject jObject = JObject.Load(reader);
// Create target object based on JObject
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(objectType); // Reflection.
// Displaying output.
foreach (System.Attribute attr in attrs)
{
if (attr is KnownTypeAttribute)
{
KnownTypeAttribute k = (KnownTypeAttribute) attr;
var props = k.Type.GetProperties();
bool found = true;
foreach (var f in jObject)
{
if (!props.Any(z => z.Name == f.Key))
{
found = false;
break;
}
}
if (found)
{
var target = Activator.CreateInstance(k.Type);
serializer.Populate(jObject.CreateReader(),target);
return target;
}
}
}
throw new ObjectNotFoundException();
// Populate the object properties
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
用法:
var ret = JsonConvert.DeserializeObject<A>(json, new KnownTypeConverter());
var ret=JsonConvert.DeserializeObject(json,new KnownTypeConverter());
感谢您的想法,Activator.CreateInstance的问题在于,在WriteJson中,我还需要IFoo对象,该对象需要使用JObject.FromObject进行转换。FromObject与ToObject的作用相同