反序列化为JObject时获取类型名称

问题描述 投票:4回答:1

有没有办法在使用反序列化时获取$ type属性?我使用TypeNameHandling进行序列化,但是当我反序列化时,我没有包含类型信息的程序集。我需要使用Type name将它存储在正确的集合中,看起来$ type不会被带到JObject。

编辑:如果我反序列化为JObject,我可以得到$ type,但如果我反序列化为具有对象作为属性的类,则类型为null。由于json中存在$ type,所以不确定为什么它会被剥离。示例如下:

班级

public class Container {
    public object Test { get; set; }
}

和去污代码

var container = new Container {
    Test = new Snarfblat()
};


var json = JsonConvert.SerializeObject(container, 
new JsonSerializerSettings {
    TypeNameHandling = TypeNameHandling.Objects
});
var deserializedContainer = JsonConvert.DeserializeObject<Container>(json);

var type = ((JObject) deserializedContainer.Test)["$type"];
// Type is null

var deserializedContainer2 = JsonConvert.DeserializeObject<JObject>(json);

var type2 = deserializedContainer2["Test"]["$type"];
// Type is snarfblat
c# json.net
1个回答
5
投票

通过在反序列化时将$type设置为MetadataPropertyHandling,可以防止Json.Net使用Ignore属性:

var deserializedContainer = JsonConvert.DeserializeObject<Container>(json,
    new JsonSerializerSettings {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore
    });

var type = ((JObject) deserializedContainer.Test)["$type"];
// Type is Snarfblat

小提琴:https://dotnetfiddle.net/VBGVue

© www.soinside.com 2019 - 2024. All rights reserved.