我在 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/