我有以下 JSON 结构
{
"entity": {
"bsid": "8452",
"name": "Name limited",
"contact": "CONTACT",
"imgurl": "http://testlocalhost.com/",
},
"doc": {
"details": {
"bsid": "8452",
"type": "pdf"
}
"name": "estimates",
}
}
我需要查找 bsid 是否存在于 JSON 结构中。需要注意的重要一点是结构可能会发生变化。但是,可以保证的是 bsid 字段将出现在我需要找到的结构中的某个位置,如果存在,则获取其值(在本例中为 8452。该值在它存在的任何地方都是相同的)
由于我使用的是 google gson 库,我知道这可以通过以下语句来实现:
jsonObject.getAsJsonObject("entity").get("bsid")
这里的 jsonObject 实际上是 google gson 的 JsonObject,它保存了上述结构
但是,正如我提到的,结构可能会发生变化,并且 bsid 可能不会直接出现在 entity 下。因此,我需要一种方法来全局查找结构中的字段。
只需要遍历json并找到值即可。
@Test
void jsonTest() {
String json = """
{
"entity": {
"bsid": "8452",
"name": "Name limited",
"contact": "CONTACT",
"imgurl": "http://testlocalhost.com/"
},
"doc": {
"details": {
"bsid": "8452",
"type": "pdf"
},
"name": "estimates"
}
}
""";
findValue(
JsonParser.parseString( json ).getAsJsonObject(),
"bsid"
)
.findAny()
.ifPresent( System.out::println );
}
private Stream<String> findValue( JsonElement json, String field ) {
if ( ! json.isJsonObject() ) return Stream.empty();
return json.getAsJsonObject()
.entrySet()
.stream()
.flatMap( entry -> field.equals( entry.getKey() ) ?
Stream.of( entry.getValue().getAsJsonPrimitive().getAsString() ) :
findValue( entry.getValue(), field )
);
}