2015-05-29 13 views
7

Ho un file in formato json, c'è un modo per convertirlo in XContentBuilder?Da Json String a XContentBuilder

Quello che voglio fare è quello di leggere un file con un po 'di mapping e quindi convertirlo in XContentBuilder

Qualcosa di simile:

XContentBuilder builder = JsonXContent.contentBuilder().source(String json); 

risposta

-1
val x: XContentBuilder = XContentFactory.jsonBuilder().value("{\"bla\":\"blub\"}") 

Non sono sicuro se questo risponde alla tua domanda, perché don Fornire molte informazioni, ma è anche possibile utilizzare le stringhe per aggiungere una mappatura a un IndexRequestBuilder:

new CreateIndexRequestBuilder(adminclient) 
    .addMapping("typeName", "{\"mapping\" : \"mapping\"}") 

Se davvero si vuole e la necessità di creare un oggetto XContentBuilder da una stringa è possibile farlo in questo modo:

String mapping = "{\"bla\":\"blub\"}" 
XContentBuilder x = XContentFactory.jsonBuilder().value(mapping) 
+0

il valore XContentFactory.jsonBuilder(). (Mapping) non funziona come previsto poiché ottengo un oggetto senza radice. Sospetto che sia ancora necessario aggiungere un .startObject()? – tbo

3

Questo sembra funzionare per me:

import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; 
import org.elasticsearch.common.xcontent.XContentBuilder; 
import org.elasticsearch.common.xcontent.XContentFactory; 
import org.elasticsearch.common.xcontent.XContentParser; 
import org.elasticsearch.common.xcontent.XContentType; 

... 

String message = "{\"bob\": \"test\"}"; 
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(message.getBytes(); 
parser.close(); 
XContentBuilder builder = jsonBuilder().copyCurrentStructure(parser); 
4

Di solito l'API dovrebbe accettare un String oppure byte[] in modo da non dover convertire. Forse vuoi CreateIndexRequestBuilder#addMapping(String, String)?

Se davvero, davvero, davvero vuoi un XContentBuilder puoi creare un XContentParser e copiare il contenuto in un costruttore. Come di elasticsearch 5.2 questo dovrebbe farlo:

String message = "{\"test\":\"test\"}"; 
    XContentBuilder b = XContentFactory.jsonBuilder().prettyPrint(); 
    try (XContentParser p = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY, message)) { 
     b.copyCurrentStructure(p); 
    } 
    System.err.println(b.string()); 

Si potrebbe forse anche fare qualcosa di con cruda, ma non credo che ne vale la pena.

Pre 5.2 non è necessaria la parte NamedXContentRegistry.EMPTY,.