@JsonIgnoreProperties注解不起作用的问题解决

Posted 鹏鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@JsonIgnoreProperties注解不起作用的问题解决相关的知识,希望对你有一定的参考价值。

  最近做的一个东西要调第三方服务接口,要参照接口文档开发,但是第三方服务的接口字段名全部都是大写,本来以为这种应该没有什么问题。但是实际开发中发现大写的字段名字去调后台接口的时候报:

  org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "LOGIN_ACCOUNT" (Class com.sitech.cloud.core.user.AccountInfo), not marked as ignorable
at [Source: org.mortbay.jetty.HttpParser$Input@11bfe02; line: 1, column: 19] (through reference chain: com.sitech.cloud.core.user.AccountInfo["LOGIN_ACCOUNT"])

  瞬间懵了,看了看错误然后又去检查了几遍代码看是不是字符有问题,但是完全一模一样呀。完全不能理解。以前根本不知道会有这样的问题。查了很多东西都说加@JsonIgnoreProperties,但是我加了也没有用,搞不太懂了。但是看到原理说是转换json的时候,会默认把字段的的首字母修改为小写这样符合驼峰命名。 

public static void main(String[] args) {
        CustInfoBo accountInfo = new CustInfoBo();
        accountInfo.setLOGIN_ACCOUNT("18720989209");
        accountInfo.setLOGIN_PASSWORD("123456");
        System.out.println(JSONObject.toJSON(accountInfo));
        
}

  一试发现还真是这么个道理,JackSon 默认是通过驼式命名法处理。还查到json有默认的处理有一个变量控制,名字为compatibleWithJavaBean,默认为false,一看代码还真有。默认static的内容的先去系统读取有没有设置这个变量,如果是true就设置为true,如果是false就设置为false,果然是这样的。解决这个的问题是可以在初始化之前设置为true或者配置系统变量,但是与我现在的系统的解决不一样。

       我直接去掉了这个@JsonProperty的引入,发现竟然有2个,我使用的是第二个,那我就试一试第一个好了。果然可以完美解决大写的字段名传入问题。注意是

import org.codehaus.jackson.annotate.JsonProperty;

  瞬间觉的自己太low了,解决问题的结果是开心的,不过还是得看看这个2个注解有撒不一样。发现Jackson有1.x系列和2.x系列,其中org.codehaus.jackson.annotate.JsonProperty是1.x系列,另外一个是2.x系列。查看jar包发现还真是这样的情况。这样就明白了2者其实是一样的,只是版本不同。至于为啥一个起作用和一个不起作用,我怀疑是跟我框架使用的jar包有关。不过目前还没有找到具体相关的内容。等有时间在把该问题好好的看一看。

以上是关于@JsonIgnoreProperties注解不起作用的问题解决的主要内容,如果未能解决你的问题,请参考以下文章

JSON注解注解@JsonIgnoreProperties和@JsonIgnore的另一个使用情况

@JsonIgnoreProperties转换实体时忽略json中不存在的字段

jackson JsonPropertyOrder和@JsonIgnoreProperties注解

杰克逊注解:JsonIgnoreProperties(ignoreUnknown=true) 和 JsonInclude(Include.NON_EMPTY) 之间的区别

Hibernate JPA中@Transient@JsonIgnoreProperties@JsonIgnore@JsonFormat@JsonSerialize等注解解释

@JsonIgnore 和 @JsonIgnoreProperties 有啥区别