Printing json data in a formatted way

This post explains how to print json data in a properly formatted way, whether the destination is console, file etc.

For example when the below code prints the json data to a file, the output will be as shown below

Initial Code


package package11;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

public class PrettyPrintDemo {
    public static void main(String[] args) throws IOException {
        JsonFactory jsonFactory = new JsonFactory();
        File file = new File("jsondata6.json");
        try(FileWriter fw = new FileWriter(file);) {
            JsonGenerator jsonGenerator = jsonFactory.createGenerator(fw);
            jsonGenerator.writeStartObject();
                jsonGenerator.writeObjectField("firstName", "Duke");
                jsonGenerator.writeObjectField("lastName", "Java");
                jsonGenerator.writeObjectField("age", 18);
                jsonGenerator.writeObjectField("streetAddress", "100 Internet Dr");
                jsonGenerator.writeObjectField("city", "JavaTown");
                jsonGenerator.writeObjectField("state", "JA");
                jsonGenerator.writeObjectField("postalCode", "12345");
                jsonGenerator.writeFieldName("phoneNumbers");
                jsonGenerator.writeStartArray();
                    jsonGenerator.writeStartObject();
                        jsonGenerator.writeObjectField("Mobile", "111-111-1111");
                    jsonGenerator.writeEndObject();
                    jsonGenerator.writeStartObject();
                    jsonGenerator.writeObjectField("Home", "222-222-2222");
                jsonGenerator.writeEndObject();
                jsonGenerator.writeEndArray();
                jsonGenerator.writeFieldName("numbers");
                jsonGenerator.writeStartArray();
                    jsonGenerator.writeNumber(1);
                    jsonGenerator.writeNumber(2);
                    jsonGenerator.writeNumber(3);
                    jsonGenerator.writeNumber(4);
                jsonGenerator.writeEndArray();
            jsonGenerator.writeEndObject();
            
            jsonGenerator.flush();
            jsonGenerator.close();
        }
    }
}

Output

{“firstName”:”Duke”,”lastName”:”Java”,”age”:18,”streetAddress”:”100 Internet Dr”,”city”:”JavaTown”,”state”:”JA”,”postalCode”:”12345″,”phoneNumbers”:[{“Mobile”:”111-111-1111″},{“Home”:”222-222-2222″}],”numbers”:[1,2,3,4]}

The output is not easily user readable. So we can format the output by adding one line of below code
jsonGenerator.useDefaultPrettyPrinter();
Just after obtaining the JsonGenerator instance.

Below is the modified code


package package11;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

public class PrettyPrintDemo {
    public static void main(String[] args) throws IOException {
        JsonFactory jsonFactory = new JsonFactory();
        File file = new File("jsondata6.json");
        try(FileWriter fw = new FileWriter(file);) {
            JsonGenerator jsonGenerator = jsonFactory.createGenerator(fw);
            jsonGenerator.useDefaultPrettyPrinter();
            jsonGenerator.writeStartObject();
                jsonGenerator.writeObjectField("firstName", "Duke");
                jsonGenerator.writeObjectField("lastName", "Java");
                jsonGenerator.writeObjectField("age", 18);
                jsonGenerator.writeObjectField("streetAddress", "100 Internet Dr");
                jsonGenerator.writeObjectField("city", "JavaTown");
                jsonGenerator.writeObjectField("state", "JA");
                jsonGenerator.writeObjectField("postalCode", "12345");
                jsonGenerator.writeFieldName("phoneNumbers");
                jsonGenerator.writeStartArray();
                    jsonGenerator.writeStartObject();
                        jsonGenerator.writeObjectField("Mobile", "111-111-1111");
                    jsonGenerator.writeEndObject();
                    jsonGenerator.writeStartObject();
                    jsonGenerator.writeObjectField("Home", "222-222-2222");
                jsonGenerator.writeEndObject();
                jsonGenerator.writeEndArray();
                jsonGenerator.writeFieldName("numbers");
                jsonGenerator.writeStartArray();
                    jsonGenerator.writeNumber(1);
                    jsonGenerator.writeNumber(2);
                    jsonGenerator.writeNumber(3);
                    jsonGenerator.writeNumber(4);
                jsonGenerator.writeEndArray();
            jsonGenerator.writeEndObject();
            
            jsonGenerator.flush();
            jsonGenerator.close();
        }
    }
}

The output will be as shown below

Output


{
  "firstName" : "Duke",
  "lastName" : "Java",
  "age" : 18,
  "streetAddress" : "100 Internet Dr",
  "city" : "JavaTown",
  "state" : "JA",
  "postalCode" : "12345",
  "phoneNumbers" : [ {
    "Mobile" : "111-111-1111"
  }, {
    "Home" : "222-222-2222"
  } ],
  "numbers" : [ 1, 2, 3, 4 ]
}

JsonGenerator by default uses an instance of DefaultPrettyPrinter class which adds two spaces at the beginning of each line and use platform specific line feeds.

Leave a Reply