2015-05-29 10 views
7

Mam plik w formacie json, czy istnieje sposób przekonwertowania go do XContentBuilder?Od Json String do XContentBuilder

Co chcę zrobić, to odczytać plik z jakiegoś mapowania, a następnie przekształcić go XContentBuilder

Coś jak:

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

Odpowiedz

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

Nie wiem, czy to odpowiedzi na swoje pytanie, bo don nie udostępniają wielu informacji, ale można również użyć ciągów, aby dodać mapowanie do obiektu IndexRequestBuilder:

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

Jeśli naprawdę chcą i potrzebują, aby utworzyć obiekt XContentBuilder z ciągu można zrobić tak:

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

Wartość XContentFactory.jsonBuilder(). (Mapowanie) nie działa zgodnie z oczekiwaniami, ponieważ nie otrzymuję root obiektu. Podejrzewam, że nadal musimy dodać .startObject()? – tbo

3

To wydaje się działać dla mnie:

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

Zazwyczaj API powinien przyjąć String lub byte[], więc nie musisz konwertować. Może chcesz CreateIndexRequestBuilder#addMapping(String, String)?

Jeśli naprawdę, naprawdę, naprawdę potrzebujesz XContentBuilder, możesz wykonać XContentParser i skopiować zawartość do konstruktora. Począwszy od Elasticsearch 5.2 powinien to zrobić:

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()); 

prawdopodobnie można też zrobić cośz surowego, ale nie sądzę, że warto.

Pre 5.2 nie potrzebujesz części NamedXContentRegistry.EMPTY,.