java - 如何获取json数组中数组内部键的值

标签 java json gson

这是我得到的字符串,我想将其解析为 json 并获取“s”、“o”、“c”和“p”的值。

{
    "head": {
        "vars": [
            "s",
            "c",
            "o",
            "p"
        ]
    },
    "results": {
        "bindings": [
            {
                "s": {
                    "type": "uri",
                    "value": "http://example.org/data/window"
                },
                "c": {
                    "type": "uri",
                    "value": "http://www.w3.org/ns/sosa/FeatureOfInterest"
                },
                "o": {
                    "type": "uri",
                    "value": "http://example.org/data/window104state"
                },
                "p": {
                    "type": "uri",
                    "value": "http://www.w3.org/ns/ssn/hasProperty"
                }
            },
                        {
                "s": {
                    "type": "uri",
                    "value": "http://example.org/data/earth"
                },
                "c": {
                    "type": "uri",
                    "value": "http://www.w3.org/ns/sosa/FeatureOfInterest"
                },
                "o": {
                    "type": "uri",
                    "value": "http://example.org/data/VCAB-DP1-BP-40location"
                },
                "p": {
                    "type": "uri",
                    "value": "http://www.w3.org/ns/sosa/hasSample"
                }
            }
        ]
    }
}

这是我迄今为止尝试过的代码:

JsonParser jsonParser =  new JsonParser();
JsonElement element = jsonParser.parse(str);
JsonObject obj = element.getAsJsonObject();
JsonObject results = obj.get("results").getAsJsonObject();
for(Map.Entry<String, JsonElement> entry : results.entrySet()) {
            JsonArray array = entry.getValue().getAsJsonObject().getAsJsonArray("bindings");
            for (JsonElement jsonElement : array) {
                 for (Map.Entry<String, JsonElement> entry1 : jsonElement.getAsJsonObject().entrySet()) {
                     System.out.println("Key = " + entry1.getKey() + " Value = " + entry1.getValue() );
                }
            }

我想要得到的是内部数组的值,如下所示: “s”:“http://example.org/data/earth” “c”:“http://www.w3.org/ns/sosa/FeatureOfInterest” ETC。 相反,我收到一个错误:

Exception in thread "main" java.lang.IllegalStateException: Not a JSON Object: [{"s":{"type":"uri","value":"http://example.org/data/window"},"c":{"type":"uri","value":"http://www.w3.org/ns/sosa/FeatureOfInterest"},"o":{"type":"uri","value":"http://example.org/data/window104state"},

(整个字符串)。

更新 感谢@Deadpool,我设法获取了这些值,但现在我需要获取绑定(bind)的“内部”值,这意味着每个绑定(bind)的“值”部分(s、c、p 和 o)。我只需要这部分而不是“类型”部分。 这是感谢 @Deadpool 的结果:

Key = s Value = {"type":"uri","value":"http://example.org/data/window"}
Key = c Value = {"type":"uri","value":"http://www.w3.org/ns/sosa/FeatureOfInterest"}
Key = p Value = {"type":"uri","value":"http://www.w3.org/ns/ssn/hasProperty"}
Key = o Value = {"type":"uri","value":"http://example.org/data/window104state"}

解决方案 好的,对于那些感兴趣的人,我设法得到了所需的声明:

System.out.println("Key = " + entry1.getKey() + " Value = " + entry1.getValue().getAsJsonObject().get("value"));

这就是期望的结果:

Key = s Value = "http://example.org/data/earth"
Key = c Value = "http://www.w3.org/ns/sosa/FeatureOfInterest"
Key = o Value = "http://example.org/data/VCAB-DP1-BP-40location"
Key = p Value = "http://www.w3.org/ns/sosa/hasSample"

最佳答案

问题出在这句话中 bindings 是一个 JsonArray,直接获取为 JsonArray

JsonArray array = entry.getValue().getAsJsonObject().getAsJsonArray("bindings");

解决方案

for(Map.Entry<String, JsonElement> entry : results.entrySet()) {
        JsonArray array = entry.getValue().getAsJsonArray();
        for (JsonElement jsonElement : array) {
             for (Map.Entry<String, JsonElement> entry1 : jsonElement.getAsJsonObject().entrySet()) {
                 System.out.println("Key = " + entry1.getKey() + " Value = " + entry1.getValue() );
            }
        }

关于java - 如何获取json数组中数组内部键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101622/

相关文章:

java - 在 0.0.0.0 上启动自定义 JMX 服务器时出错

java - 如何知道 JTable 是否为空?

java - 是否有任何技术可以使用标志参数拆分方法?

javascript - 通过 ANGularJS Controller 从本地加载 JSON 文件并将其传递到 ANGularJS 自定义指令范围

javascript - 将 JSON 对象传递给 onclick 函数

java - 将 GsonBuilder 转换为 Kotlin

java - java从文本文件中的特定位置获取单词

javascript - 通过 API post 请求将数十万个 JSON 对象发送到数据库

java - InputStream 到 JsonObject - GSON

java - 是否可以用 Gson 扁平化 JSON 层次结构?