java - jackson 在 map 上捕捉到无法识别的领域

标签 java jersey jackson

我在 java Rest Api 中使用 Jackson 来处理请求参数。

我的 Bean 类:

public class ZoneModifBeanParam extends ModifBeanParam<Zone> {
@FormParam("type")
private String type;

@FormParam("geometry")
private Geometry geometry;

@FormParam("name")
private String name;

...

我的 API 接口(interface):

@POST
@Consumes("application/json")
@Produces("application/json; subtype=geojson")
@ApiOperation(value = "Create a zone", notes = "To create a zone")
public Response createZone(ZoneModifBeanParam zoneParam) {

...

这工作正常,但我需要接收我的 Bean 在 Map 中未指定的其他参数。 示例:

{
   "geometry": {...},
   "name": "A circle name",
   "type": "4",
   "hello": true
}

通过接收此消息,我需要将这对夫妇(“hello”,true)存储在一个 Map(名为 unrecognizedFields 并在我的 bean 中声明)中。

是否有任何注释或对象允许这样做?

最佳答案

只需使用 @JsonAnySetter .这就是它的用途。这是一个测试用例

public class JacksonTest {

    public static class Bean {
        private String name;
        public String getName() { return this.name; }
        public void setName(String name) { this.name = name; }

        private Map<String, Object> unrecognizedFields = new HashMap<>();

        @JsonAnyGetter
        public Map<String, Object> getUnrecognizedFields() {
            return this.unrecognizedFields;
        }

        @JsonAnySetter
        public void setUnrecognizedFields(String key, Object value) {
            this.unrecognizedFields.put(key, value);
        }
    }

    private final String json
            = "{\"name\":\"paul\",\"age\":600,\"nickname\":\"peeskillet\"}";
    private final ObjectMapper mapper = new ObjectMapper();

    @Test
    public void testDeserialization() throws Exception {
        final Bean bean = mapper.readValue(json, Bean.class);
        final Map<String, Object> unrecognizedFields = bean.getUnrecognizedFields();

        assertEquals("paul", bean.getName());
        assertEquals(600, unrecognizedFields.get("age"));
        assertEquals("peeskillet", unrecognizedFields.get("nickname"));
    }
}

@JsonAnyGetter 用于序列化端。序列化 bean 时,您将不会在 JSON 中看到 unrecognizedFields。相反, map 中的所有属性都将序列化为 JSON 中的顶级属性。

关于java - jackson 在 map 上捕捉到无法识别的领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44288406/

相关文章:

java - org.postgresql.util.PSQLException : ERROR: syntax error at or near "("

java - 复合键类中的@OneToOne 注释不起作用

java - 数组未正确初始化。 BasicDBObject 无法创建 BasicDBObject 类型的数组

java - jsp中删除db中带空格的数据

java - java和mysql中的restful webservice

java - jersey sse 不适用于 Wildfly 8.2

java - Hibernate Entity 到 Json 对象,使用 jackson 到 http post

java - 努力将 JSON 负载映射到模型类

java - 由于输入结束, jackson 无法映射空数组,没有内容可映射到对象

java - 维基百科 API 返回的摘录没有文章中的所有字符?