我想使用Jackson将Java对象转换为JSON格式。我有一个类看起来几乎是以下结构
public Class Event
{
String type;
String timestamp;
String hostname;
String service;
Payload payload;
}
我有上述字段的getter和setter以及Payload类中的getter / setter。
这是json格式,我想要
{
"type":"end",
"time":"2016-08-01 11:11:11:111",
"origin":{
"hostname":"<hostname>",
"service":"<service>"
},
"version":"1.0"
"data":{ .... }
}
我似乎无法找到获得上述格式的jackson方法,不知道如何将整个有效负载对象放在“数据”节点中以及如何将主机名,服务放在“origin”节点中。
答案 0 :(得分:0)
从您的问题来看,这是一种应该展示如何解决它的方法。由于您只发布了1个类,我将有效负载更改为地图。它与其他类的工作方式相同。
考虑这个例子:
public class JacksonTest {
public static void main(String[] args) throws JsonProcessingException {
Event e = new Event();
e.type="end";
e.service="<service>";
e.hostname = "<hostname>";
e.timestamp = LocalDateTime.now().toString();
Map<String,String> payload = new HashMap<>();
payload.put("param1", "xyz");
e.payload = payload;
String writeValueAsString = new ObjectMapper().writeValueAsString(e);
System.out.println(writeValueAsString);
}
public static class Event {
@JsonProperty
String type;
@JsonProperty("time")
String timestamp;
@JsonIgnore
String hostname;
@JsonIgnore
String service;
@JsonProperty("data")
Map<String, String> payload;
@JsonProperty("origin")
Map<String,String> getOrigin() {
Map<String,String> tmp = new HashMap<>();
tmp.put("hostname", hostname);
tmp.put("service", service);
return tmp;
}
@JsonProperty("version")
private String getVersion() {
return "1.0";
}
}
}
我使用我想要的必要属性和它们应该具有的名称来注释Event类。由于您希望主机名和服务处于嵌套设置而不是为它创建新对象(因为您可以将序列化的新对象更容易),我忽略了这些对象,而是使用getter来创建必要的结构作为地图。
输出结果为:
{
"type":"end",
"time":"2016-08-19T16:45:18.072",
"data":{"param1":"xyz"},
"origin":{
"hostname":"<hostname>",
"service":"<service>"
},
"version":"1.0"
}
Regads,
阿图尔