java中使用gson检查JsonObject中是否存在字段

问题描述 投票:0回答:1

我有以下 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 下。因此,我需要一种方法来全局查找结构中的字段。

java json gson
1个回答
0
投票

只需要遍历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  )
        );
}
© www.soinside.com 2019 - 2024. All rights reserved.