【发布时间】:2014-07-29 17:47:22
【问题描述】:
我在 C# 端有一个类,看起来像这样:
[DataContract]
public class MyObject
{
[DataMember]
public SomeEnum FooType { get; set; }
[DataMember]
public FooBase MyFoo { get; set; }
}
基本上,属性FooType 中的值应该告诉您属性MyFoo 中存在从FooBase 派生的特定类型。
现在,如果我只想反序列化从 FooBase 派生的对象,我可以这样做:
var myFoo = JsonConvert.DeserializeObject(myJsonString, typeof(FooDerived)) as FooDerived;
但是我如何反序列化 MyObject 其中嵌套了 FooBase 对象,并且关于它是什么类型的信息只能通过首先部分反序列化对象来确定?
我认为这将需要一个从 JsonConverter 派生的自定义转换器,但我不完全确定如何使 ReadJson 在这里工作。
这样的?
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var result = new MyObject();
while(reader.Read())
{
if(reader.TokenType == JsonToken.PropertyName)
{
var prop = reader.Value as string;
if (prop == "FooType")
{
reader.Read();
result.FooType = (SomeEnum)reader.ReadAsInt32(); // or something like that
}
if (prop == "MyFoo")
{
reader.Read();
// now the reader.TokenType should be StartObject, but I can't
// deserialize the object because I don't know what type it is
// I might not have read "FooType" yet
// So I really need to pull this whole sub object out as a string
// and deserialize it later???
}
}
}
return result;
}
【问题讨论】:
-
@BrianRogers:我不认为它是完全重复的(这里的多态部分是嵌套的,这使得这有点棘手),但我认为那里的答案确实给了我很好的解决方法问题。如果我在搜索时首先发现了这个问题,我可能就不需要问了。
-
是的,我也是这么想的——它已经足够接近让您解决问题了。很高兴你成功了。
标签: c# json serialization json.net