首先反序列化 属性 不匹配任何目标对象的属性到特定的 属性

Deserialize first property not matching any target object's properties into specific property

我正在做一些网络 API 与 Newtonsoft.Json 的集成,而且一如既往,我必须做一些愚蠢的特技来正确反序列化他们发回的内容。

在这种情况下,API 将发送类似于这种结构的响应:

{ "contacts": [ ... ], "has-more": true, "offset": 38817 }

"has-more" 和 "offset" 属性在不同的方法响应上几乎保持不变,并且已在我反序列化到的响应对象上相应地定义。响应对象看起来像这样:

public class APIResponse {
    public JContainer Result { get; set; }
    [JsonProperty("has-more")]
    public bool HasMore { get; set; }
    [JsonProperty("offset")]
    public int Offset { get; set; }
}

第一个"contacts"属性是可以变化的;对于某些方法,我可能会得到 "contacts",有些可能会得到 "companies",而其他人可能会得到谁知道的结果。我也没有任何方法可以确定每个响应都会有这样的 "variable" 属性,也没有任何方法可以确定它会是第一个,就位置而言。

对于这个例子,我想要发生的是反序列化器查看 Json 并说,"Let's see, I don't see anything mapping to 'contacts', so we'll put that into 'Result', and then I can see from the JsonProperty attributes that 'has-more' and 'offset' go into HasMore and Offset. Okay, all set, here's your object."

我怀疑这涉及一些自定义 JsonConverterIContractResolver 的技巧,但我只是不在这里将这些点联系起来。我尝试做一个简单的自定义合同解析器,但它似乎使用合同解析器将对象 属性 名称解析为 属性 名称以在 JSON 文本中查找,反之亦然。

您可以为每种响应类型使用基础 class + 派生。

public class APIResponseBase {
    [JsonProperty("has-more")]
    public bool HasMore { get; set; }
    [JsonProperty("offset")]
    public int Offset { get; set; }
}

public class ContactsResponse : APIResponseBase {
  public IEnumerable<Contact> Contacts { get; set; }
}

public class CompaniesResponse : APIResponseBase {
  public IEnumerable<Company> Companies { get; set; }
}

var contactsResponse = JsonConvert.Deserialize<ContactsResponse>(json);
IEnumerable<Contact> contacts = contactsResponse.Contacts