在反序列化父类型之前,Json.net对未知类型进行反序列化

本文关键字:反序列化 类型 未知 net 父类 Json | 更新日期: 2023-09-27 18:09:50

所以我使用json.net来反序列化来自互联网的一些数据。而提供数据的大脑瓜让我很为难。我试图反序列化的对象的一个属性的数据类型取决于对象中另一个属性的内容,如下所示:

{"typeindicator":"一","object_I_Need":{…格式化为对象类型A…}}

{"typeindicator":"B","object_I_Need":{…格式化为对象类型B…}}

我需要"object_I_Need",不管它是类型A还是B,我有这两种类型的模式。

我不需要在反序列化器中完全解决这个问题。我只是JsonExtensionDataAttribute检查未知字段,所以我想知道我是否可以让object_I_Need落入其中,然后分别反序列化…有办法做到吗?

我在这里有什么选择?我想我可以把整个东西反序列化成一个动态对象,决定object_I_Need是什么类型,然后再序列化?不过我希望有更好的办法。建议感激。

谢谢,事故

在反序列化父类型之前,Json.net对未知类型进行反序列化

您可以使用Newtonsoft将其反序列化为dynamic对象,然后从那里构建您的对象。

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson);
var myObject = new O();
if (dyn.typeindicator.Value == "A") {
    myObject.PropA = dyn.object_I_Need.AAAA.Value;
}
else
{
    myObject.PropA = dyn.object_I_Need.anotherA.Value;
}

我是这么做的:

public class DeCrash
{
    [JsonProperty("object_I_Need")]
    protected JObject ObjectINeed;
    [JSonProperty("typeindicator")]
    public String TypeIndicator { get; set; }
    [JsonIgnore]
    public TypeA ObjectA 
    { 
        get 
        { 
           return TypeIndicator == "A" ? ObjectINeed.ToObject<TypeA> : null;
        }
    }
    [JsonIgnore]
    public TypeB ObjectB
    { 
        get 
        { 
           return TypeIndicator == "B" ? ObjectINeed.ToObject<TypeB> : null;
        }
    }
}