[FIXED] Entfernen von maskierten Zeichenfolgen im Java-JSON-Objekt

Ausgabe

Ich habe ein Java-Programm, das bei einigen Parametern dynamisch Abfragen für ElasticSearch erstellt. Derzeit entgeht die Art und Weise, wie ich dies gebaut habe, den Zeichenfolgen, da das JsonObject als Teil der GSON-Bibliothek von Google eine Zeichenfolge zum Anhängen von JSON übergeben muss.

Die Ausgabe der folgenden Methoden ist die folgende:

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

Wie Sie sehen können, handelt es sich bei den Existing-Werten um Escapes, und ElasticSearch macht diesbezüglich einen Anfall. Wie kann ich dieses Ergebnis erzielen, ohne die Escape-Zeichenfolgen zu haben?

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;
}

Unten ist der Code für die buildFilterQueryForField(*). In dieser Methode habe ich versucht, einen Regex zu verwenden, um diese zu entfernen, aber dieser Regex gibt mir nicht das Ergebnis, nach dem ich suche.

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;
}

Das Endziel dafür ist das Folgende:

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

Lösung

Diese Escapezeichen sind erforderlich, da Sie tatsächlich ein anderes JSON-Objekt in den Zeichenfolgenwert für das existsFeld einbetten. Anstatt zu verwenden addProperty, sollten Sie builder.add("exists", nestedObj)genau wie anderswo verwenden.


Beantwortet von –
jtahlborn


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like