当前位置: 首页 > 知识库问答 >
问题:

将不匹配任何目标对象属性的第一个属性反序列化为特定属性[重复]

谷梁裕
2023-03-14

我正在与NewtonSoft.json进行一些web API集成,和往常一样,我必须做一些愚蠢的特技来正确地反序列化它们发送回来的内容。

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

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

在这个例子中,我想让反序列化器查看Json并说,“让我们看看,我没有看到任何映射到'contacts'的东西,所以我们将它放入'result',然后我可以从JsonProperty属性中看到'haves-more'和'offsite'进入HasMore和offsite。好了,所有设置,这是您的对象。”

我怀疑这涉及到自定义JSONConverterIcontractResolver中的一些技巧,但我只是不把这些点联系起来。我尝试使用一个简单的自定义契约解析器,但它似乎使用契约解析器将对象属性名解析为在JSON文本中查找的属性名,而不是相反。

共有1个答案

陈誉
2023-03-14

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

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
 类似资料:
  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将

  • 问题内容: 我正在针对返回JSON数据的第三方API进行编程,但是格式可能有点奇怪。某些属性可以是一个对象(包含一个Id属性),也可以是一个字符串(它是该对象的ID)。例如,以下两个都是有效的: 和 我正在尝试使用JSON.net将其反序列化为强类型类,但到目前为止运气还不足。我最好的主意是将其序列化为两个属性,一个为字符串,另一个为对象,并为每个属性使用自定义JsonConverter以允许变量

  • 问题内容: 我有一些具有各种属性的JSON,其中大多数是简单数据类型。但是,我在JSON中有一个属性,当我将其反序列化为C#类时,我只需要将其反序列化为字符串即可。 JSON示例: 除了将是有效的JSON对象外,“ json”对象没有任何设置结构。 因此,在上面的示例中,“ json”的值是一个JSON对象-但是当它反序列化时,我需要将它作为字符串。 因此,如果我的C#类是: 然后,如果我使用:

  • 问题内容: 有一个丑陋的XML文件必须解组: 产生的Java对象应为: 这个问题的答案非常接近,但我不知道最终的解决方案。 问题答案: 怎么样? 介绍一个称为选项的通用超类: 然后在带有选项列表的类(在本示例中为Configuration)上,在该属性上指定一个@XmlJavaTypeAdapter: XmlAdapter看起来像这样: AdaptedOptions看起来像:

  • 这是我的代码: 我想将的值设置为,我该怎么做?我试过,

  • 我有一个POJO类,它将从JSON反序列化,JSON在Spring中作为请求体出现。此POJO类包含列表 我的JSON对象如下所示 下面是示例方法调用 我遵循了给出的建议,下面给出了反序列化程序代码

  • 我正在尝试使用Gson反序列化格式为“2018-05-27”的json中的date属性。在反序列化之后,我希望日期为LocalDate格式。 对于json输入: {"id": 1,"name":"test","start Date":"2018-01-01","endDate":"2018-01-05",} 我收到startDate和endDate的错误: Java语言lang.IllegalSt