在java中将json字符串分为两个不同的json字符串
我对json非常陌生,通常不使用json来编写代码。 我想要一个以下面的json字符串作为输入的服务在java中将json字符串分为两个不同的json字符串,java,json,jackson,Java,Json,Jackson,我对json非常陌生,通常不使用json来编写代码。 我想要一个以下面的json字符串作为输入的服务 { "var": "test11", "_env": { "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", "eventID": 49167, "recvTi
{
"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"
}
及
这只是一个例子。它可以包含更多json字符串中的对象,并且_env不会总是出现在末尾
使用jackson API有什么简单的方法可以实现吗?创建一个类来保存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);
}
这样,无论\u 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));
}
JsonNode node=mapper.readTree(JSON);
List nodeJsons=new ArrayList();
迭代器nodeIterator=node.fields();
while(nodeIterator.hasNext()){
Map.Entry=nodeIterator.next();
add(mapper.writeValueAsString(条目));
}
通过这种方式,您将在最后拥有一个json字符串列表,每个节点都由自身序列化,而不是一个包含所有内容的“大”json。对于动态输入,最好将json加载到映射中:
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();
}
}
publicstaticvoidmain(字符串[]args)
{
ObjectMapper mapper=新的ObjectMapper();
try(Reader=newfilereader(“C://Temp/xx.json”)){
//将任何json加载到映射中
@抑制警告(“未选中”)
Map inMap=mapper.readValue(reader,Map.class);
系统输出打印LN(inMap);
//用于为找到的每个键生成json的exmaple
for(字符串键:inMap.keySet()){
writeValue(System.out,Collections.singletonMap(key,inMap.get(key));
}
}捕获(例外e){
e、 printStackTrace();
}
}
不需要自定义类和配置。输入中的任何内容都会加载到映射中。您可以为每个单独的键生成一个json,或者以您喜欢的任何方式互操作映射内容您知道原始json中所有键的名称以及要分离出来的键吗?
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();
}
}