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

时间:2015-09-11 19:15:35

标签: c# json json.net

这是一个接近我正在尝试做的样本:

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属性。

1 个答案:

答案 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("...")]属性...