我如何说服JSON.NET给我我的数据?它拒绝反序列化$ref属性

本文关键字:拒绝 反序列化 属性 ref 数据 我的 NET JSON | 更新日期: 2023-09-27 18:12:27

下面是一个接近我要做的示例:

void Main()
{
    var settings = new JsonSerializerSettings
    {
        PreserveReferencesHandling = PreserveReferencesHandling.None,
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    };
    var json = "{ '"$ref'": '"THIS IS DATA, NOT A JSON.NET REFERENCE'", '"other'": '"other'" }";
    var deserialized = JsonConvert.DeserializeObject<MyType>(json, settings);
    Console.WriteLine(deserialized.Ref);
}
[JsonObject(IsReference = false)]
public class MyType
{
    [JsonProperty("$ref")]
    public string Ref { get; set; }
    [JsonProperty("other")]
    public string Other { get; set; }
}

基本上,我需要将"$ref"作为跨文档引用或当前文档中对LATER的引用来处理。要了解更多背景信息,请参阅Path Item Object的Swagger规范。

不幸的是,JSON。NET似乎根本不允许这样做。我尝试过一个自定义的IReferenceResolver实现,但是没有足够的功能来解析反序列化期间的引用。这是因为引用几乎总是解析到文档后面的项,并且没有$id属性。

我如何说服JSON.NET给我我的数据?它拒绝反序列化$ref属性

我认为你可以得到你想要的一些预处理

var json = "{ '"$ref'": '"THIS IS DATA, NOT A JSON.NET REFERENCE'", '"other'": '"other'" }";
var jObj = JObject.Parse(json);
jObj.Descendants()
    .OfType<JProperty>()
    .Where(p => p.Name == "$ref")
    .ToList()
    .ForEach(p => p.Replace(new JProperty("Ref", p.Value)));
var deserialized =  jObj.ToObject<MyType>();
Console.WriteLine(deserialized.Ref);

BTW:只是删除[JsonProperty("...")]属性…