Monday, 20 July 2015

How to format JSON String in Java - Example Tutorial

You can format JSON String in Java using Jackson API's pretty print feature. As you might have noticed in the my previous JSON tutorials that the output of the programs is not properly formatted, which makes them hard to read, especially in large log files where there are so many other text, both JSON and normal text is there. That's why its advised to print JSON String properly formatted because then it will stand out in log file or console. Whenever we print JSON String from Java Programs by using method writeValueAsString(), it usually comes in one line, as shown in following example :

{"name":"Virat","sport":"cricket","age":25,"id":121,"lastScores":[77,72,23,57,54,36,74,17]}

This is not very readable as you cannot see how many attributes are there, what is their name and value, compare it to following formatted output which is printed using Jackson's pretty print feature:

{
  "name" : "Virat",
 "sport" : "cricket",
  "age" : 25,
  "id" : 121,
  "lastScores" : [ 77, 72, 23, 57, 54, 36, 74, 17 ]
}

Its way better than earlier output, its much more readable. You can easily identify which one is just simple name value pair, which one is JSON array and much more. Wondering, how to nicely print JSON String, just checkout the example shown in next section.


JSON String Format and Pretty Print Example

In this example you will learn how to format JSON String using Jackson's Pretty Print feature. It's easy to to format JSON text, all you need to do is instead of just calling writeValueAsString() you need to first get defaultPrettyPrintWrite and then call writeValueAsString() method on that object. This will ensure that your JSON data will be nicely printed on console or log file i.e. wherever you print it.

import java.io.IOException;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

/**
 * Java program to format JSON String using Jackson API. Jackson provides
 * nice pretty print feature to print JSON text as formatted output.
 *
 * @author Javin Paul
*/
public class JSONPrintDemo{

    public static void main(String args[]) {

        int[] recentScores = {77, 72, 23, 57, 54, 36, 74, 17};
        Player cricketer = new Player("Virat", "cricket", 25, 121, recentScores);

        ObjectMapper mapper = new ObjectMapper();

        try {
            System.out.println("Default JSON String:" + mapper.writeValueAsString(cricketer));
            System.out.println("formatted JSON String \n" + mapper.defaultPrettyPrintingWriter().writeValueAsString(cricketer));
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

class Player {

    private String name;
    private String sport;
    private int age;
    private int id;
    private int[] lastScores;

    public Player(String name, String sport, int age, int id, int[] lastinnings) {
        this.name = name;
        this.sport = sport;
        this.age = age;
        this.id = id;
        lastScores = lastinnings;
    }

    public final String getName() {
        return name;
    }

    public final String getSport() {
        return sport;
    }

    public final int getAge() {
        return age;
    }

    public final int getId() {
        return id;
    }

    public final int[] getLastScores() {
        return lastScores;
    }

    public final void setName(String name) {
        this.name = name;
    }

    public final void setSport(String sport) {
        this.sport = sport;
    }

    public final void setAge(int age) {
        this.age = age;
    }

    public final void setId(int id) {
        this.id = id;
    }

    public final void setLastScores(int[] lastScores) {
        this.lastScores = lastScores;
    }

    @Override
    public String toString() {
        return "Player [name=" + name + ", sport=" + sport + ", age=" + age + ", id=" + id + "]";
    }

}



Output
Default JSON String:{"name":"Virat","sport":"cricket","age":25,"id":121,"lastScores":[77,72,23,57,54,36,74,17]}
formatted JSON String
{
  "name" : "Virat",
  "sport" : "cricket",
  "age" : 25,
  "id" : 121,
  "lastScores" : [ 77, 72, 23, 57, 54, 36, 74, 17 ]
}



Maven Dependency and JAR Files for Jackson

Since Jackson library is not part of core Java, you need to either specify Maven dependency in pom.xml file or you need to manually download those JAR file and put in your application's classpath.

<dependency>
     <groupId>org.codehaus.jackson</groupId>
     <artifactId>jackson-xc</artifactId>
     <version>1.9.12</version>
</dependency>
How to format JSON String in Java with example

JAR files
C:\.m2\repository\org\codehaus\jackson\jackson-xc\1.9.12\jackson-xc-1.9.12.jar
C:\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.12\jackson-core-asl-1.9.12.jar
C:\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.12\jackson-mapper-asl-1.9.12.jar


That's all on how to format JSON String in Java using Jackson API's pretty print facility. This example is very useful while printing JSON in log files to differentiate it from other String outputs. Formatted output not only stands out in logs but also they are easier to read but there is one drawback also. You cannot grep them in one line, you need to use grep command with context option to grep couple of lines around matching to see full JSON output.

If you like this tutorial and want to learn more about how to deal with JSON in Java, please checkout following amazing Java JSON tutorials  :
  • How to parse large JSON document in Java? (code example)
  • How to read JSON String using json-simple library? (code example)
  • How to convert JSON String to Java Object with example? (solution)
  • How to convert JSON Array to String Array in Java? (solution)

No comments:

Post a Comment