当前位置: 首页 > 知识库问答 >
问题:

在嵌套JSON(io.vertx.core.JSON)中按键查找值

隆安然
2023-03-14

我有这样一个嵌套的JSON,它存储在io.vertx.core.JSON.jsonObject中。

{
    "field1" : [],
    "field2" : "value1",
    "field3" : [],
    "field4" : [{
        "field5" : "value2",
        "field6" : {
            "date" : "2021-04-27"
        }
    }]
}
Optional<Map.Entry<String, Object>> result =
    myJsonObject.stream()
                .filter(p -> p.getKey().contains("field5"))
                .findAny();

我正在使用io.vertx.core.json,并且只能使用这个库。

共有1个答案

孔鸿哲
2023-03-14

我修改了方法,使其与io.vertx.core.json包兼容。

com.google.gson.jsonElement->java.lang.object
jsonElement.getasjsonObject()(JsonArray)->(JsonArray)jsonElement

io.vertx.core.json.jsonObject实现iterable > object>,所以我可以在它上使用foreach

//...
  private static void traverseAndCollectByKey(Object jsonElement, String key) {
    if (jsonElement instanceof JsonObject) {
      JsonObject jsonObject = (JsonObject) jsonElement;

      if (jsonObject.containsKey(key)) {
        results.add(jsonObject.getValue(key));
      }
      jsonObject.forEach(entry -> traverseAndCollectByKey(entry.getValue(), key));

    } else if (jsonElement instanceof JsonArray) {
      ((JsonArray) jsonElement).forEach(item -> traverseAndCollectByKey(item, key));
    }
  }
//...

io.vertx.core.json.jsonObjectio.vertx.core.json.jsonArray也有stream方法,所以这个函数稍微简化了一下:

//...
  private static Stream<Map.Entry<String, Object>> recursiveFlattening(
      Entry<String, Object> entry) {

    Object jsonElement = entry.getValue();

    if (jsonElement instanceof JsonObject) {
      return ((JsonObject) jsonElement).stream()
                                       .flatMap(Main::recursiveFlattening);

    } else if (jsonElement instanceof JsonArray) {
      return ((JsonArray) jsonElement).stream()
                                      .map(v -> Map.entry("", v))
                                      .flatMap(Main::recursiveFlattening);

    } else {
      return Stream.of(entry);
    }
  }
}

可玩演示:https://replit.com/@huzz4/traverse-and-collect-from-json-iovertxcorejson

Optional<Map.Entry<String, Object>> result =
    myJsonObject.stream()
                .flatMap(Main::recursiveFlattening)
                .filter(e -> "field5".equals(e.getKey()))
                .findAny();
 类似资料:
  • 问题内容: 假设我有一个对象: 我想找到一个id为1的对象。是否有类似这样的功能?我可以使用Underscore的方法,但必须从顶部开始然后向下过滤。 问题答案: 递归是您的朋友。我更新了该函数以说明属性数组:

  • 问题内容: 假设我有一个像这样的JSON数组: 不,我想基于id查找某个对象,一旦有了该对象,就需要它的子代及其所有childs子代 所以可以说如果 4d024610-a39b-49ce-8581-a18500739a75* 我想找到一个具有ID的元素 * 那应该找到Element Sub2 现在,它应该产生所有将产生的所有子元素id id: 假设我会做 因此,我猜它有两个部分,首先找到“父”元素

  • 我陷入了需要检查嵌套JSON对象中是否存在键的情况。通过嵌套JSON对象,我在父JSON对象中有一个JSON对象作为其键之一的值。所以我需要检查这个键是否存在于整个JSON对象中。我将以下数据作为对象获取。我知道我可以解析这个对象以获取JSON对象。 我使用了方法来检查主JSON对象中是否存在密钥,它可以正常工作。但是要检查任何内部JSON对象,比如“info”,我需要再次将解析为JSON对象,然

  • 问题内容: 我有正在使用nodeJS读取的csv文件。我在阅读之前将每个文件转换为文本。 文件中的每一行都有以’=’分隔的数据。 每行看起来像 “ =“之前的第一部分代表我应用程序中json对象的索引。我的目的是解析此数据并为其构建json表示,以便上面的行成为 使用javascript / node js; 如何将应该表示嵌套JSON键序列的字符串转换为上述json对象? 问题答案: 您可以分割

  • 我正在使用jpa的criteriabuilder,希望在jsonb列中查找json字段的值。jsonb如下所示: 我开始创建我的谓词,但我得到了错误。 我得到的错误是 psqlException:错误:函数json_extract(jsonb,字符变化)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 有人能帮忙吗?

  • 问题内容: 我想实现的想法是一个ID表。基本上,它具有以下结构(user_id,teacher_id),其中user_id是指我的User表中的主键,而讲者ID是指我的讲师表中的主键。 我正在尝试在Redis中实现此功能,但是如果我将键设置为用户的主要ID,则当我尝试运行查询时,例如 获得讲师ID = 5的所有记录, 因为讲师不是键,但是我不会 值 能够在O(1)时间到达。 如何形成上面提到的id