【发布时间】:2016-11-04 20:47:24
【问题描述】:
我知道过去有很多关于使用 Newtonsoft 进行反序列化的问题,但我一直无法找到与我的情况完全匹配的东西。 (如果我无意中问了一个重复的问题,请告诉我,我很难相信我是第一个遇到这种情况的人。
我有一个这样的对象结构:
public class Logger
{
public List<MethodAPI> List { get; set; }
}
private class MethodAPI
{
public string MethodName { get; set; }
public List<Parameter> Parameters { get; set; }
}
现在对于我在反序列化时遇到问题的类型。如果我执行以下操作:
public class Parameter
{
public IProduct data { get; set; }
}
然后反序列化就可以了。但是,直到运行时,我才真正知道 data 是什么类型。但是,如果我执行以下操作:
public class Parameter
{
public object data { get; set; }
}
显然,当我去反序列化这个 Newtonsoft 时,它无法解决它实际上应该是什么类型。因此,它只是使其成为JObject。
通常,我只会编写一个自定义转换器。但是,我不确定在这种情况下如何实现 ReadJson 方法。
public class ParameterConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.Equals(typeof(Parameter));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// I'd rather just do serializer.Deserialize<Parameter>(reader) here but that'll cause a stack overflow exception
object obj = serializer.Deserialize(reader);
Parameter param = (obj as JObject).ToObject<Parameter>();
// This works great if I know that I'm converting this to IProduct, but is there an elegant way to figure out what type to use here?
// I have to pass the serializer here because the serializer can "map" IProduct and several of its "child" types to its implementation
param.data = (param.data as JObject).ToObject(typeof(IProduct), serializer);
return param;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// Serialization's no problem
serializer.Serialize(writer, value);
}
}
正如我在代码 cmets 中提到的,我感到困惑的部分是如何根据原始 JSON 确定原始对象的类型。有没有人对这样做的非可怕方式提出建议?
【问题讨论】:
-
也许
new JsonSerializerSettings() { TypeNameHandling = ......} -
@L.B 谢谢,这似乎正是我所需要的——甚至不需要自定义转换器。
-
@L.B 如果您作为答案发布,我将很高兴接受/支持
-
EJoshuaS,您可以接受自己的答案。不需要重复同样的事情......
标签: c# json json.net deserialization