我对json很新,通常不会使用很多编码。 我想要一个以json字符串作为输入
的服务{
"var": "test11",
"_env": {
"activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a",
"uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a",
"eventID": 49167,
"recvTime": "Thu Apr 14 00:27:03 PDT 2016"
}
}
并将输出吐出为
{
"var": "test11"
}
和
{
"_env": {
"activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a",
"uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a",
"eventID": 49167,
"recvTime": "Thu Apr 14 00:27:03 PDT 2016"
}
}
这只是一个例子。它可以在json字符串中包含更多对象,并且_env不会总是出现在最后。
有没有简单的方法来实现使用jackson API?
答案 0 :(得分:3)
创建一个类来保存您的JSON,如下所示:
public class Bar {
private String var;
@JsonProperty("_env")
private Object env;
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public Object getEnv() {
return env;
}
public void setEnv(Object env) {
this.env = env;
}
}
在反序列化之前将映射器设置为在未知属性上不失败;
public static void main(String[] argv) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Bar bar = mapper.readValue(JSON, Bar.class);
}
这样,无论何时_env
存在,它都会起作用。
如果你需要按每个节点“拆分”json,你可以这样做:
JsonNode node = mapper.readTree(JSON);
List<String> nodeJsons = new ArrayList<>();
Iterator<Entry<String, JsonNode>> nodeIterator = node.fields();
while (nodeIterator.hasNext()) {
Map.Entry<String, JsonNode> entry = nodeIterator.next();
nodeJsons.add(mapper.writeValueAsString(entry));
}
这样你最终会得到一个json字符串列表,每个节点都是自己序列化的,而不是一个带有所有东西的“大”json。
答案 1 :(得分:1)
使用动态输入时,最好将json加载到Map:
public static void main(String[] args)
{
ObjectMapper mapper = new ObjectMapper();
try (Reader reader = new FileReader("C://Temp/xx.json")) {
// load whatever json into Map
@SuppressWarnings("unchecked")
Map<String, Object> inMap = mapper.readValue(reader, Map.class);
System.out.println(inMap);
// exmaple for generating json for each key found
for (String key : inMap.keySet()) {
mapper.writeValue(System.out, Collections.singletonMap(key, inMap.get(key)));
}
} catch (Exception e) {
e.printStackTrace();
}
}
无需自定义类和模糊的jackson配置。输入中的任何内容都会加载到Map中。你可以为每个单独的密钥生成一个json,或者以你喜欢的方式与地图内容交互