我如何说服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
属性。
我认为你可以得到你想要的一些预处理
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("...")]
属性…