2015-05-29 2707 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,部分。