java - 如何检索特定的 Json 对象,无论其在 Json 中的深度如何?

标签 java json

在自动化测试运行期间,我遇到了如下的 JsonObject,我们称之为 jsonObject

{
    "434": {
        "Test1": {
            "id": "0001",
            "Name": "John"
        }
    },
    "435": {
        "Test2": {
            "id": "0002",
            "Name": "John"
        }
    }
}

我想检索 Test1 的 JsonObject和Test2 。我可以像这样检索它:

jsonObject.getJsonObject("434").getJsonObject("Test1");
jsonObject.getJsonObject("435").getJsonObject("Test2");

但是值434435不是常数。当我重新运行测试时,这次可能是一些不同的数字。因此我不知道下次会出现什么而不是 434435

有什么方法可以获取 Test1 的 JsonObject和Test2无论434435 (类似于 jsonObject.someMethod("Test1"); )?

我正在使用javax.json图书馆。

最佳答案

您可以使用 jsonObject.keys() 来获取当前 JSON 对象中所有属性名称的迭代器。这将允许您执行以下操作:

Iterable<String> keys = () -> jsonObject.keys();
List<JSONObject> nestedFilteredObjects = stream(keys.spliterator(), false)
        .filter(key -> jsonObject.getJSONObject(key).has("Test"))
        .map(key -> jsonObject.getJSONObject(key))
        .collect(toList());

当然,您仍然需要为 json 异常添加 try-catch,并考虑当属性不是 json 对象时会发生什么(getJSONObject 将抛出异常)。

类似下面的代码应该可以做到。请记住,我没有测试它,您可以根据您的需求进行调整 - 我不知道您的测试中可能有哪些可能的 json:

private static List<JSONObject> getNestedTestObjects(JSONObject jsonObject) {
    @SuppressWarnings("Convert2MethodRef")
    Iterable<String> keys = () -> jsonObject.keys();
    return stream(keys.spliterator(), false)

            .map(key -> object(jsonObject, key))
            .filter(object -> object instanceof JSONObject)
            .map(object -> (JSONObject) object)

            .filter(object -> object.has("Test"))

            .map(object -> object(object, "Test"))
            .filter(object -> object instanceof JSONObject)
            .map(object -> (JSONObject) object)

            .collect(toList());
}

private static Object object(JSONObject jsonObject, String key) {
    try {
        return jsonObject.get(key);
    } catch (JSONException e) {
        throw new RuntimeException(e);
    }
}

关于java - 如何检索特定的 Json 对象,无论其在 Json 中的深度如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459776/

相关文章:

json - 在 Elasticsearch 中将 Json 字段存储为字符串?

java - 如何在RecyclerView中使用HashMap数据?

java - 使用 CSS 选择器在关闭 Span 后获取文本

java - 如何模拟 junit 测试的结果元数据

java - java中如何替换文件内容?

javascript - 如果对象名称包含句点,如何提取 Json 对象值?

java - 如何在android中停止jsonParser.makeHttpRequest

java - GridLayout Jpanel 添加不考虑首选大小

java - Spring 3 - 具有单独 JSP 的主题

php - 如何从反向地理编码 JSON 结果中获取格式化地址?