我一直在尝试使用Java中的Jackson Streaming API来处理以下内容:
{
"objs": [
{
"A": {
"a": "b",
"c": "d"
},
"B": {
"e": "f",
"g": "h"
},
},
{
"C": {
"i": "j",
"k": "l"
},
"D": {
"m": "n",
"o": "p"
},
}
]
}
对于objs
键下数组中的每个顶级对象(在此示例中,键为“ A”和“ B”的对象,另一个键为“ C”和“ D”的对象)我想将每个对象提取为原始String;我可能要解析成千上万个,所以我不想将它们映射到模型对象。
我很难弄清楚该怎么做,因为当我遍历JSON令牌时,我无法识别出一个布尔条件,该条件告诉我我正处在这些对象之一的确切起点。此外,一旦确定了开始该如何使用流API提取对象,然后继续进行下一个操作?
我习惯于使用Jackson的自动反序列化功能,这在尝试在流媒体环境中进行思考时会令我失望。
答案 0 :(得分:0)
应该使用JsonPath库轻松解决您的情况,该库可以解决此类问题。下面的示例显示所有必需的子节点:
import com.jayway.jsonpath.JsonPath;
import java.io.File;
import java.util.List;
import java.util.Map;
public class JsonPathApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
List<Map> nodes = JsonPath.parse(jsonFile).read("$.objs.*.*");
nodes.forEach(System.out::println);
}
}
打印:
{a=b, c=d}
{e=f, g=h}
{i=j, k=l}
{m=n, o=p}
使用Jackson
,您可以使用JSON
方法将给定的readTree
有效负载读取为树。参见以下示例:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.io.File;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonFile);
ArrayNode objs = (ArrayNode) root.at("/objs");
objs.forEach(node -> {
node.forEach(property -> {
System.out.println(property.toString());
});
});
}
}
上面的代码显示:
{"a":"b","c":"d"}
{"e":"f","g":"h"}
{"i":"j","k":"l"}
{"m":"n","o":"p"}