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

删除 Java JSON 对象中转义的字符串

文增
2023-03-14

我有一个Java程序,它将动态地为ElasticSearch构建一些参数的查询。目前,我构建这个的方式逃脱了字符串,因为JsonObject作为Google GSON库的一部分需要传递一个字符串来附加JSON。

以下方法的输出如下:

{
   "query":{
      "bool":{
         "filter":[
            {
               "exists":"{\"field\":\"user_id\"}"
            },
            {
               "exists":"{\"field\":\"campaign_id\"}"
            }
         ]
      }
   }
}

如您所见,存在的值是转义,ElasticSearch对此提出了一个合适的建议。如果没有转义字符串,我如何实现这个结果?

JsonObject buildQuery() {
    JsonObject request = new JsonObject();

    // build the terms query
    JsonArray termsArr = new JsonArray();
    termsArr.add(buildFilterQueryForField("user_id"));
    termsArr.add(buildFilterQueryForField("campaign_id"));
    JsonObject terms = JsonHelper.createObject("bool.filter", termsArr);
    request.add("query", terms);

    return request;
}

下面是< code > buildFilterQueryForField(*)的代码。在这个方法中,我试图使用一个正则表达式来删除这些,但是这个正则表达式没有给出我想要的结果。

static JsonObject buildFilterQueryForField(String fieldName) {
    JsonObject builder = new JsonObject();
    JsonObject nestedObj = new JsonObject();
    nestedObj.addProperty("field", fieldName);
    builder.addProperty("exists", nestedObj.toString().replaceAll("\\\\", ""));
    return builder;
}

这方面的最终目标如下:

{
   "query":{
      "bool":{
         "filter":[
            {
                "exists": { "field": "user_id" }
            },
            {
                "exists": { "field": "campaign_id" }
            },
         ]
      }
   }
}

共有1个答案

慕容成文
2023-03-14

这些转义是必需的,因为您实际上是在exists字段的字符串值中嵌入另一个json对象。您应该使用builder而不是addProperty。add(“exists”,nestedObj)就像在其他地方一样。

 类似资料:
  • 我想转动这根绳子: 到这个里面 用似乎没有明显的方法来做到这一点? 更准确地说,我想将反斜杠的转义改为转义字符。

  • 问题内容: 我有一个像这样的URL: 在字符串对象中。 有人可以告诉我,如何删除反斜杠吗? 我正在为黑莓系统编程。 问题答案: 参见String.replace(CharSequence,CharSequence)

  • 问题内容: 我从公共API接收到一个JSON对象,该对象本身具有一个转义的JSON字符串。 我如何将此属性转换为实际的JSON对象(未转义),以便使用NewtonSoft Json.NET反序列化整个响应? 问题答案: 这是我根据 Sam 的答案使用的可行解决方案:

  • 问题内容: 这是我的字符串: 我正在使用代码从SSH命令检索输出,并且我希望我的字符串仅包含 如何删除多余的转义序列? 问题答案: 使用正则表达式删除它们: 或者,在没有VERBOSE标志的情况下,以压缩形式: 演示: 上面的正则表达式涵盖所有7位ANSI C1转义序列,但不包括8位C1转义序列打开器。后者在当今的UTF-8世界中从未使用过,在UTF-8世界中,相同范围的字节具有不同的含义。 如果

  • 问题内容: 为了回答这个问题,我设法通过转义反斜杠来使字符串成为转义字符。 当我尝试将其概括为转义所有转义的字符时,它似乎无能为力: 但是对于特定的转义字符使用相同的方法,它确实起作用: 有一般的方法可以做到这一点吗?应包括,,,等。 问题答案: 使用r’text’将字符串定义为raw,如下面的代码所示: