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

杰克逊-必须的财产?

包永新
2023-03-14

我在对象映射器上使用Jackson的readValue()方法从JSON文件中读取并将其转换为我的java对象。

如。

mapperObject.readValue( node, MyTargetClass.class )

我可以在MyTargetClass上设置任何注释来强制执行所需的属性吗?例如,如果我有一个属性为ABC、DEF和GHI的JSON对象,我的JSON如下

{
  "ABC" : "somevalue"
  "DEF" : "someothervalue" 
}

我希望它以某种方式失败,并且只有在readValue上成功,如果它包含ABC、DEF和GHI。

共有3个答案

雷逸仙
2023-03-14

如果您想确保提供了json字段,则必须使用@JsonProperty(value="field Name",必需=true)注释作为构造函数的参数。但这还不够,构造函数还应该有@JsonCreator注释。

例如,如果您有一个名为“endPoint”的字段,并且希望确保它在JSON文件中提供,那么如果没有提供,下面的代码将抛出异常

@JsonCreator
public QuerySettings(@JsonProperty(value = "endPoint", required = true) String endPoint) {
        this.endPoint = endPoint;
}

我发现这个链接有助于理解杰克逊的注释。它也很好地解释了为什么必需=true是不够的,并且与它的名字背道而驰。

龚俭
2023-03-14

Jackson不包括验证功能,这是设计上的(即被认为超出范围)。但通常使用的是Bean验证API实现。这样做的好处是数据格式处理和验证逻辑之间的解耦。这就是DropWizard等框架的用途;这也是JAX-RS(比如Jersey)为JAX-RS 2.0所做的努力的方向。

岳英锐
2023-03-14

您可以使用@JsonProperty(required=true)注释将属性标记为required,如果属性丢失或为null,它将在反序列化过程中引发JsonMappingException。

编辑:我对此投了反对票,没有发表评论。我很想知道为什么,因为它做的事情完全正确。

 类似资料:
  • 问题内容: 我在对象映射器上使用Jackson的readValue()方法从JSON文件读取并将其转换为我的Java对象。 例如。 我可以在MyTargetClass上设置任何注释以强制执行必需的属性吗?例如,如果我有一个具有ABC,DEF和GHI属性的JSON对象,而我的Json是以下内容 我希望它以某种方式失败,并且仅在readValue包含ABC,DEF和GHI时才能成功。 问题答案: Ja

  • 问题内容: 我正在使用Jackson从JSON创建Java对象。假设我有一个像这样的JSON字符串: 和这样的pojo: 因此,c显然是未知的属性-它将被排除在外。我想知道,有什么办法可以记录c未知和被忽略的情况? 问题答案: 我不知道有任何内置工具可以做到这一点。您可以用 标记注释,可用于定义一个非静态的,两个参数的方法(属性的第一个参数名称,第二个要设置的值),用作从JSON内容中找到的所有其

  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 我目前正在尝试使用能够处理多态性的jackson实现反序列化程序,也就是说,给定这两个类: 反序列化器应该能够从json字符串推断和实例化正确的子类。 我使用自定义解串器模块,即唯一属性多态态序列化器(从 https://gist.github.com/robinhowlett/ce45e575197060b8392d)。此模块的配置如下: 该模块向用户询问动物的每个子类的唯一属性。因此,当反序列

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A