Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化到JObject时获取类型名称_C#_Json.net - Fatal编程技术网

C# 反序列化到JObject时获取类型名称

C# 反序列化到JObject时获取类型名称,c#,json.net,C#,Json.net,使用反序列化时,是否有方法获取$type属性?我在启用TypeNameHandling的情况下进行序列化,但是当我反序列化时,我没有包含类型信息的程序集。我需要使用类型名将其存储在正确的集合中,看起来$Type没有被带到JObject 编辑:如果我反序列化为一个JObject,我可以得到$type,但是如果我反序列化为一个以对象作为属性的类,则类型为null。不知道为什么它会被剥离,因为$type存在于json中。示例如下: 班级 public class Container { pub

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

编辑:如果我反序列化为一个JObject,我可以得到$type,但是如果我反序列化为一个以对象作为属性的类,则类型为null。不知道为什么它会被剥离,因为$type存在于json中。示例如下:

班级

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
var容器=新容器{
测试=新Snarfblat()
};
var json=JsonConvert.SerializeObject(容器,
新JsonSerializerSettings{
TypeNameHandling=TypeNameHandling.Objects
});
var deserializedContainer=JsonConvert.DeserializeObject(json);
var type=((JObject)反序列化容器.Test)[“$type”];
//类型为空
var deserializedContainer2=JsonConvert.DeserializeObject(json);
var type2=反序列化的容器2[“Test”][“$type”];
//这是一种蜗牛

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

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

var type = ((JObject) deserializedContainer.Test)["$type"];
// Type is Snarfblat
var deserializedContainer=JsonConvert.DeserializeObject(json, 新JsonSerializerSettings{ MetadataPropertyHandling=MetadataPropertyHandling.Ignore }); var type=((JObject)反序列化容器.Test)[“$type”]; //这是一种蜗牛
Fiddle:

有趣的是,如果我将其反序列化为JObject而不是包含对象的类,我就能够获得类型。查看我的更新。