首先反序列化 属性 不匹配任何目标对象的属性到特定的 属性
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."
我怀疑这涉及一些自定义 JsonConverter
或 IContractResolver
的技巧,但我只是不在这里将这些点联系起来。我尝试做一个简单的自定义合同解析器,但它似乎使用合同解析器将对象 属性 名称解析为 属性 名称以在 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
我正在做一些网络 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."
我怀疑这涉及一些自定义 JsonConverter
或 IContractResolver
的技巧,但我只是不在这里将这些点联系起来。我尝试做一个简单的自定义合同解析器,但它似乎使用合同解析器将对象 属性 名称解析为 属性 名称以在 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