C# Json.NET:反序列化任何类型的对象

C# Json.NET:反序列化任何类型的对象,c#,json,json.net,C#,Json,Json.net,我有一个json文件,如下所示: { "tags": { "t1": { "description": "bar" }, "t2": { "description": { "$ref": "./t2.md" } } } } 我想用Json.NET

我有一个json文件,如下所示:

{
  "tags": {
    "t1": {
      "description": "bar"
    },
    "t2": {
      "description": {
        "$ref": "./t2.md"
      }
    }
  }
}
我想用Json.NET将其反序列化如下:

{
  "tags": {
    "t1": {
      "description": "bar"
    },
    "t2": {
      "description": {
        "$ref": "./t2.md"
      }
    }
  }
}
var baz=JsonConvert.DeserializeObject(File.ReadAllText(@“baz.json”); //... 内部类Baz { [JsonProperty(“标记”)] 内部标签; } 内部类标记:字典 { } 内部类标记 { [JsonProperty(“描述”)] 内部描述; } 内部类说明//FIXME:可以是字符串、字典或列表 { }
如何定义
描述
类,该类可以是
字符串
字典
?我已尝试继承抽象方法,但反序列化程序始终返回
null

您可以创建自定义反序列化程序:

public类DescriptionConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回false;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
if(reader.TokenType==JsonToken.String)
{
//如果是字符串,则返回字符串
返回序列化程序。反序列化(读取器,objectType);
}
其他的
{
//如果不是字符串,请尝试获取字段“$ref”
var obj=JObject.Load(读卡器);
if(obj[“$ref”]!=null)
返回obj[“$ref”].ToString();
其他的
抛出新的InvalidOperationException(“无效Json”);
}
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
}
然后可以在模型中指定此转换器:

内部类Baz
{
[JsonProperty(“标记”)]
内部标签;
}
内部类标记:字典
{
}
内部类标记
{
[JsonProperty(“描述”)]
[JsonConverter(类型(DescriptionConverter))]
内部字符串描述;
}
最后,您可以反序列化json:

static void Main(字符串[]args)
{
字符串json=@”{
“标签”:{
‘t1’:{
'description':'bar'
},
‘t2’:{
“说明”:{
“$ref”:“./t2.md”
}
}
}
}";
var baz=JsonConvert.DeserializeObject(json);
Console.WriteLine(“t1:+baz.Tags[“t1”].说明);
Console.WriteLine(“t2:+baz.Tags[“t2”]”说明);
}
输出:

t1 : bar
t2 : ./t2.md

描述的字段“$ref”可以有其他名称?否,它是字符串或
{“$ref”:“…”}
对象。您需要自定义反序列化程序:。例如:@咆哮。它是一个有一个键值对的JS对象,因此相当于一个有一个条目的字典。@谢谢,这是在您发布的第二个链接中使用的
obj[“$ref”]
。请添加一个答案,以便我可以接受。