使用 javax.json.stream.JsonParser 和 Java 流解析的 JSON 字符串值的额外引号

use*_*095 8 java json java-stream

我正在使用 Java Streams 解析从 REST 服务调用接收到的一些 JSON JsonParser.getObjectStream(),并过滤特定值,但从未获得我期望的匹配项。深入挖掘,我发现返回的字符串值在开头和结尾包含额外的双引号。

这是一些代码来说明。首先,我展示获取值的“直接”方法,然后展示流方法。

package com.company.jsonptest;

import java.io.StringReader;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.stream.JsonParser;

public class GetStringTest {
    public static void main(String[] args) {
        System.out.println("Direct...");
        JsonParser parser = Json.createParser(new StringReader(json));
        parser.next();
        JsonObject jsonObject = parser.getObject().asJsonObject();
        String username = jsonObject.getString("firstname");
        String name = jsonObject.getString("lastname");
        System.out.println("firstname: " + username);
        System.out.println("lastname: " + name);

        System.out.println("Streams...");
        JsonParser parser2 = Json.createParser(new StringReader(json));
        parser2.next();
        parser2.getObjectStream().forEach(entry -> {
            String key = entry.getKey();
            String value = entry.getValue().toString();
            String type = entry.getValue().getValueType().toString();
            System.out.println(key + ": " + value + " (" + type + ")");
        });
    }

    private static String json = "{\n"
        + "  \"firstname\": \"John\",\n"
        + "  \"lastname\": \"Smith\"\n"
        + "}";
}
Run Code Online (Sandbox Code Playgroud)

这是输出。请注意额外的引号。我已包含 JsonValue 类型作为额外检查。

Direct...
firstname: John
lastname: Smith

Streams...
firstname: "John" (STRING)
lastname: "Smith" (STRING)
Run Code Online (Sandbox Code Playgroud)

除了添加额外的步骤来去掉引号之外,有没有办法解决这个问题?

Mal*_*wig 9

问题在于,getObjectStream()仅将元素迭代为s,这会丢失第一种方法中的JsonValue键入方法。JsonObject最大的区别是您使用toString()(它只返回 后面的 json“事物” :) 而不是getString()(它将该“事物”解释为字符串)。

为了获取此信息(以及类似的方法getString()),您必须将 转换JsonValueJsonString

String value = ((JsonString) entry.getValue()).getString();
Run Code Online (Sandbox Code Playgroud)

这将返回不带引号的值。


请参阅此 Javadoc 以获取示例,其中将搜索的元素强制转换为JsonArray

https://static.javadoc.io/javax.json/javax.json-api/1.1.0-M1/javax/json/stream/JsonParser.html