Jackson Java到JSON对象映射器修改了字段的名称

hee*_*oir 8 java json jackson objectmapper

使用Jackson将Java对象转换为JSON

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
jsonMessage = mapper.writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)

结果是字段"参与者"(它是对象实例的一部分)

participants    Arrays$ArrayList<E> 
Run Code Online (Sandbox Code Playgroud)

被重命名为"participantList"

participantsList":[{"userId":"c1f9c"}]
Run Code Online (Sandbox Code Playgroud)

即"列表"附加到字段名称.我浏览了杰克逊的文档,但没有找到防止这种情况发生的方法.这可能吗?在独立项目中测试上述代码不会导致相同的结果(即不进行重命名).为什么杰克逊表现得像这样?不幸的是,对象是第三方,我无法改变它.

使用Jackson版本2.3.3(使用2.9.0验证相同的行为).

hee*_*oir 4

Oleksandr 的评论指出了正确的方向。事实上,Jackson 在确定 JSON 字段名称时似乎考虑了 getParticipantsList()。但是,正如我之前所写,考虑到它是第三方对象,我无法在那里进行任何更改。

但是,随着对导致问题的原因有了更好的了解,我能够想出一个解决方案:

mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY).withGetterVisibility(Visibility.NONE).withIsGetterVisibility(Visibility.NONE));
Run Code Online (Sandbox Code Playgroud)

或者

mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.IS_GETTER, Visibility.NONE);
Run Code Online (Sandbox Code Playgroud)

  • 您没有使用 Jackson 2.6+,因此此评论与您无关,但可能对其他人而言:setVisibilityChecker 自 2.6 起已被弃用。您必须使用 setVisibility 来代替。http://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/ObjectMapper.html#setVisibilityChecker(com.fasterxml.jackson.databind.introspect.VisibilityChecker) (2认同)