在Jackson中映射动态json对象字段?

我在以下架构中具有json对象

{

name: "foo",

timestamp: 1475840608763,

payload:

{

foo: "bar"

}

}

在这里,该payload字段包含一个嵌入的json对象,并且该对象的模式是动态的,并且每次都不同。

payload对象是不同的API服务,以及不同的API服务的不同方法获得的原始输出。不可能将其映射到所有可能的值。

是否可能有如下所示的java类:

public class Event

{

public String name;

public long timestamp;

public JsonObject payload;

}

或者类似的东西,以便我可以接收基本架构并对其进行处理,然后将其发送到相关类,该类将转换payload为适当的预期类?

回答:

回答:

您可以JsonNodecom.fasterxml.jackson.databind包装中使用:

public class Event {

public String name;

public long timestamp;

public JsonNode payload;

// Getters and setters

}

然后使用以下方法解析它:

String json = "{\"name\":\"foo\",\"timestamp\":1475840608763,"

+ "\"payload\":{\"foo\":\"bar\"}}";

ObjectMapper mapper = new ObjectMapper();

Event event = mapper.readValue(json, Event.class);

回答:

例如,考虑您要将JsonNode实例映射到以下类:

public class Payload {

private String foo;

// Getters and setters

}

可以使用以下代码来实现:

Payload payload = mapper.treeToValue(event.getPayload(), Payload.class);

回答:

根据您的要求,您可以使用Map<String,

Object>代替JsonNode

public class Event {

public String name;

public long timestamp;

public Map<String, Object> payload;

// Getters and setters

}

如果需要将a转换Map<String, Object>为POJO,请使用:

Payload payload = mapper.convertValue(event.getPayload(), Payload.class);

根据Jackson的文档,该convertValue()方法在功能上类似于先将给定值序列化为JSON,然后将JSON数据绑定到给定类型的值,但是由于不需要(不需要)进行完全序列化,因此该方法应更有效。但是,相同的转换器(序列化器和反序列化器)将用于数据绑定,这意味着相同的对象映射器配置有效。

以上是 在Jackson中映射动态json对象字段? 的全部内容, 来源链接: utcz.com/qa/413994.html

回到顶部