【问题标题】:Extract part of json string with streaming api and convert to a jsonTree (Jackson)使用流 api 提取部分 json 字符串并转换为 jsonTree (Jackson)
【发布时间】:2016-03-01 22:20:42
【问题描述】:

我有一个嵌套的 json 结构:

"info": [
       {
        "name":"Alice",
        "phone": [{
            "home": "1234567890",
            "mobile": "0001112223"
        }]
    },
    {
        "name":"Bob",
        "phone": [{
            "home": "3456789012",
            "mobile": "4445556677"
        }]
    }
]

我正在使用杰克逊。 我只想提取有关“鲍勃”的信息并将其读入树中。我确实不想将整个结构读入树中(我知道该怎么做),然后提取有关 Bob 的信息。我想使用流 API(JsonParser)首先用“Bob”提取所有信息,然后将其制作成 jsontree。

我以为我会将它读入一个字节数组,然后将其转换为一棵树,如下所示:

JsonToken token = null;
byte[] data;
int i = 0;

while( jParser.nextToken()!=JsonToken.END_ARRAY) {
    data[i] = jParser.getByteValue();
    i ++;
}
JsonNode node = null;
ObjectMapper objectMapper = new ObjectMapper();

try {
    node = objectMapper.readValue(jParser, JsonNode.class);
    }
catch(Exception e) {
    e.printStackTrace();
}

但是,这并没有返回我想要的结果。有一个 jsonParse 异常,所以我认为这不是要走的路。

【问题讨论】:

  • 异常?您不认为该异常的内容可能有用吗? :-)
  • 没有?很高兴听到您的想法... :-)
  • 我的意思是,如果没有异常消息,就无法知道发生了什么。代码看起来是合法的。但我也有更好的编码想法,会添加答案。

标签: java json jackson jackson-modules


【解决方案1】:

使用 JSON 指针应该可以在这里工作。在功能上,将其读取为JsonNode,extracting 可能类似于:

JsonNode stuff = mapper.readTree(source).at("/info/1");

但是你也可以不用全部阅读就可以得到它

JsonNode stuff = mapper.reader().at("/info/1").readTree(source);

或任何你想要的路径表达式。但是请注意,与 XPath(等)不同,您不能使用子树过滤来检查(例如)要读取的 Object 的“name”属性是否与“Bob”匹配。

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2013-01-23
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多