将JObject解析为混合对象(静态+动态字段)

时间:2020-03-18 07:03:00

标签: json.net

给出以下json

{
    "$$href": "http://localhost:8080/url1",
    "name": "Sebastian Slutzky"
}

我想反序列化为这样的对象

public class DomainObject
{
    [JsonProperty("$$href")]
    public string href { get; set; }
    public JObject this[string key] => throw new NotImplementedException();
 }

以便可以动态访问任意属性(例如name

 var href = domainObject.href;
 var name = domainObject["name"] as string;

我目前的实现方式是将JObject传递给对象的构造函数,并对其进行修饰(即合成)。有没有一种方法可以通过继承来解决此问题(即通过扩展JObject? 还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以使用JsonExtensionData。例如

public class DomainObject
{
    [JsonProperty("$$href")]
    public string href { get; set; }
    [JsonExtensionData]
    private IDictionary<string, JToken> UnknownTypes;

    public JToken this[string key] => UnknownTypes[key];
}

索引器现在允许您使用以下键检索动态属性的值。

var result = JsonConvert.DeserializeObject<DomainObject>(json);
var name = result["name"].Value<string>();