如何用复合模式反序列化Json-C#,Json



由于我必须永远搜索答案,这将按原样工作,因此我将在这里提供一个示例,当您使用复合模式结构序列化和反序列化对象时。

我的问题是反序列化这种类结构(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);

最新更新