这是一个接近我正在尝试做的样本:
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
属性。
答案 0 :(得分:1)
我认为你可以通过一些预处理得到你想要的东西
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("...")]
属性...