由于我必须永远搜索答案,这将按原样工作,因此我将在这里提供一个示例,当您使用复合模式结构序列化和反序列化对象时。
我的问题是反序列化这种类结构(https://en.wikipedia.org/wiki/Composite_pattern):
abstract class BaseClass
{
public int Id { get; set; }
}
class Leaf : BaseClass
{
public string Foo { get; set; }
}
class Composite : BaseClass
{
public List<BaseClass> ClassList = new List<BaseClass>();
}
串行化使用:
var composite = new Composite();
JsonConvert.SerializeObject(composite, Formatting.Indented);
沙漠化并没有开箱即用。
反序列化的解决方案是构建CustomConverter:
public class BaseClassJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(BaseClass) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
try
{
var jObject = JObject.Load(reader);
var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Converters.Add(new BaseClassJsonConverter());
if (jObject.ContainsKey("Foo"))
return JsonConvert.DeserializeObject<Leaf>(jObject.ToString(), jsonSerializerSettings);
else if (jObject.ContainsKey("ClassList"))
return JsonConvert.DeserializeObject<Composite>(jObject.ToString(), jsonSerializerSettings);
else
throw new System.SystemException("Class not implemented");
return null;
}
catch (JsonReaderException)
{
return null;
}
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
与我发现的其他答案的关键区别在于,它们没有将ReadJson中的设置再次放入SeserialzieObject
中,这样它就无法处理递归结构的反序列化(将JSON反序列化为抽象类(。
现在,您可以用[JsonConverter(typeof(BaseConverter))]
装饰BaseClass
或者在设置中使用转换器调用反序列化:
var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Converters.Add(new BaseClassJsonConverter());
JsonConvert.DeserializeObject<BaseClass>(jsonString, jsonSerializerSettings);