Generate JSON document

edit

Generate JSON document

edit

There are different way of generating JSON document:

  • Manually (aka do it yourself) using native byte[] or as a String
  • Using Map that will be automatically converted to its JSON equivalent
  • Using a third party library to serialize your beans such as Jackson
  • Using built-in helpers XContentFactory.jsonBuilder()

Internally, each type is converted to byte[] (so a String is converted to a byte[]). Therefore, if the object is in this form already, then use it. The jsonBuilder is highly optimized JSON generator that directly constructs a byte[].

Do It Yourself

edit

Nothing really difficult here but note that you will have to encode dates regarding to the Date Format.

String json = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
    "}";

Using Map

edit

Map is a key:values pair collection. It represents very well a JSON structure:

Map<String, Object> json = new HashMap<String, Object>();
json.put("user","kimchy");
json.put("postDate",new Date());
json.put("message","trying out Elastic Search");

Serialize your beans

edit

Elasticsearch already use Jackson but shade it under org.elasticsearch.common.jackson package.
So, you can add your own Jackson version in your pom.xml file or in your classpath. See Jackson Download Page.

For example:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.1.3</version>
</dependency>

Then, you can start serializing your beans to JSON:

import com.fasterxml.jackson.databind.*;

// instance a json mapper
ObjectMapper mapper = new ObjectMapper(); // create once, reuse

// generate json
String json = mapper.writeValueAsString(yourbeaninstance);

Use Elasticsearch helpers

edit

Elasticsearch provides built-in helpers to generate JSON content.

import static org.elasticsearch.common.xcontent.XContentFactory.*;

XContentBuilder builder = jsonBuilder()
    .startObject()
        .field("user", "kimchy")
        .field("postDate", new Date())
        .field("message", "trying out Elastic Search")
    .endObject()

Note that you can also add arrays with startArray(String) and endArray() methods. By the way, field method
accept many object types. You can pass directly numbers, dates and even other XContentBuilder objects.

If you need to see the generated JSON content, you can use the string() method.

String json = builder.string();