在自动化测试运行期间,我遇到了如下的 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");
但是值434
和435
不是常数。当我重新运行测试时,这次可能是一些不同的数字。因此我不知道下次会出现什么而不是 434
和435
有什么方法可以获取 Test1
的 JsonObject和Test2
无论434
和435
(类似于 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/