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)
除了添加额外的步骤来去掉引号之外,有没有办法解决这个问题?
问题在于,getObjectStream()
仅将元素迭代为s,这会丢失第一种方法中的JsonValue
键入方法。JsonObject
最大的区别是您使用toString()
(它只返回 后面的 json“事物” :
) 而不是getString()
(它将该“事物”解释为字符串)。
为了获取此信息(以及类似的方法getString()
),您必须将 转换JsonValue
为JsonString
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
归档时间: |
|
查看次数: |
1676 次 |
最近记录: |