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

泽西/杰克逊@JsonIgnore在二传手上

欧阳斌
2023-03-14

我有一个带有以下注释的类:

class A {
public Map<String,List<String>> references;

@JsonProperty
public Map<String,List<String>> getReferences() {
...
}

@JsonIgnore
public void setReferences(Map<String,List<String>>) {
}
...
}
}

我尝试的是忽略反序列化的json。但它不起作用。始终在 JSON 字符串到达时,Jackson lib 将填充 references 属性。如果我只使用@JsonIgnore注释,则 getter 不起作用。这个问题有什么解决方案吗?

谢啦

共有3个答案

马庆
2023-03-14

您必须确保在字段级别和二传手上都有@JsonIgnore注释,并且 getter 用@JsonProperty进行注释。

public class Echo {

    @Null
    @JsonIgnore
    private String doNotDeserialise;

    private String echo;

    @JsonProperty
    public String getDoNotDeserialise() {
        return doNotDeserialise;
    }

    @JsonIgnore
    public void setDoNotDeserialise(String doNotDeserialise) {
        this.doNotDeserialise = doNotDeserialise;
    }

    public String getEcho() {
        return echo;
    }

    public void setEcho(String echo) {
        this.echo = echo;
    }
}

@Controller
public class EchoController {

@ResponseBody
@RequestMapping(value = "/echo", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
    public Echo echo(@RequestBody @Valid Echo echo) {
        if (StringUtils.isEmpty(echo.getDoNotDeserialise())) {
            echo.setDoNotDeserialise("Value is set by the server, not by the client!");
        }

        return echo;
    }
}
  • 如果您提交一个JSON请求,并将“doNotDeserialise”值设置为某些值,则当JSON被反序列化为对象时,它将设置为null(如果不是,我会在字段上放置验证约束,以便它将出错)
  • 如果将“doNotDeserialise”值设置为服务器上的某些值,则它将被正确序列化为 JSON 并推送到客户端
公良飞尘
2023-03-14

从Jackson 2.6开始,有一种新的改进方法可以使用JsonProperty#access()注释来定义只读只写属性。建议不要使用单独的JsonIgnoreJsonProperty注释。

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public Map<String,List<String>> references;
寇坚成
2023-03-14

我认为有两个关键部分应该使您能够按照需要拥有“只读集合”。首先,除了忽略setter之外,请确保您的字段还标有@JsonIgnore

class A {

  @JsonIgnore
  public Map<String,List<String>> references;

  @JsonProperty
  public Map<String,List<String>> getReferences() { ... }

  @JsonIgnore
  public void setReferences(Map<String,List<String>>) { ... }

}

其次,为了防止getters被用作setter,禁用< code > USE _ GETTERS _ AS _ SETTERS 功能:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.USE_GETTERS_AS_SETTERS);
 类似资料:
  • 我一直想知道JacksonFeature。泽西2.17仍然需要上课。我看不出JacksonFeature代码之间的输出有任何区别。类是否已注册。 然后,我从codingpedia中分叉了一个代码,删除了JacksonFeature.class,升级到Spring 4.1.2和jersey 2.17,更新了代码,测试仍然通过。 因此,我创建了一个非常简单的web服务来再次测试这个github链接,考

  • 我试图能够定义以下代码: 我知道我需要使用: 要正确设置对象映射器,以便能够在rest资源上接受单个值作为数组。我成功地安装了那个部件。 我对这种方法的问题是,以下内容是不可区分的: 和 将产生一个大小为1的列表。然后,在方法create(List myObjects)中,我将无法区分List和发送到Rest资源的单个对象。 那么,我的问题是如何做到这一点。我们的想法是只有一个@POST同时接受数

  • 开发JAX-RS应用程序并解决问题。需要从我的资源中自定义json输出以使用Jackson(2.22.2)解析器而不是默认Moxy(根据此答案)。 这是pom。xml片段 我还配置web.xml文件默认使用Jackson 但是资源输出与我使用注释和序列化器配置的有所不同。这是表示为json的模型 和序列化程序 } 这是资源片段 响应json根本不是定制的。 期望的输出是 谢谢。

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

  • 我正在使用泽西(2.23.1)和。但这与Jackson 2.5.4相关联。但我需要使用Jackson 2.6.0(或更新版本)。 我怎么能这么做? 我试着把它放在我的pom里。xml: 然后使用jackson 2.6.0。(我也尝试过更新的版本。) 但是我的rest应用程序抛出了各种各样的方法错误,比如: 有没有办法在Jackson 2.6.0或更新版本中使用Jersey 2.23.1?TIA!

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