从Json String到XContentBuilder

tbo*_*tbo 14 elasticsearch

我有一个json格式的文件,有没有办法将其转换为XContentBuilder?

我想要做的是读取带有一些映射的文件,然后将其转换为XContentBuilder

就像是:

XContentBuilder builder = JsonXContent.contentBuilder().source(String json);
Run Code Online (Sandbox Code Playgroud)

Nik*_*Nik 10

通常情况下,API应该接受一个String或者byte[]所以你不应该需要转换.也许你想要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());
Run Code Online (Sandbox Code Playgroud)

你可能也可以做一些原始的东西,但我不认为这是值得的.

Pre 5.2你不需要这个NamedXContentRegistry.EMPTY,部分.


小智 5

这似乎为我工作:

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);
Run Code Online (Sandbox Code Playgroud)


Mei*_*ign -1

val x: XContentBuilder = XContentFactory.jsonBuilder().value("{\"bla\":\"blub\"}")
Run Code Online (Sandbox Code Playgroud)

不确定这是否回答了您的问题,因为您没有提供太多信息,但您也可以使用字符串将映射添加到 IndexRequestBuilder:

new CreateIndexRequestBuilder(adminclient)
  .addMapping("typeName", "{\"mapping\" : \"mapping\"}")
Run Code Online (Sandbox Code Playgroud)

如果您确实想要并且需要从字符串创建 XContentBuilder 对象,您可以这样做:

String mapping = "{\"bla\":\"blub\"}"
XContentBuilder x = XContentFactory.jsonBuilder().value(mapping)
Run Code Online (Sandbox Code Playgroud)