2015-05-29 64 views
7

我有一個json格式的文件,有沒有辦法將它轉換爲XContentBuilder?從Json字符串到XContentBuilder

我想要做的就是讀取文件的一些映射,然後將其轉換爲XContentBuilder

喜歡的東西:

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

回答

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

不知道這是否回答你的問題,因爲你不提供很多信息,但您也可以使用字符串將映射添加到IndexRequestBuilder:

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

如果你真的想和需要創建一個字符串的XContentBuilder對象,你可以這樣做是這樣的:

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

XContentFactory.jsonBuilder().value(mapping)不能按預期工作,因爲我得到一個沒有對象的根。我懷疑還是需要添加一個.startObject()? – tbo

3

這似乎爲我工作:

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

通常的API應該接受Stringbyte[],所以你不需要轉換。也許你想CreateIndexRequestBuilder#addMapping(String, String)

如果你真的,真的,真的想要一個XContentBuilder可以使一個XContentParser和內容複製到一個建設者。作爲Elasticsearch 5.2的這個應該這樣做:

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

你也許還做東西與原始,但我不認爲這是值得的。

前5.2你不需要NamedXContentRegistry.EMPTY,部分。