使用Jackson Streaming API从数组中提取对象

时间:2019-05-03 19:28:50

标签: java json jackson streaming

我一直在尝试使用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的自动反序列化功能,这在尝试在流媒体环境中进行思考时会令我失望。

1 个答案:

答案 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"}