Generate a Json from Strings using Jackson library

Posted on

Problem

I am pretty new to Java and I got a requirement of converting Strings to a json structure. My below codes works fine but I have to create multiple objects and my code looks bit ugly. I want to know the better approach.

I want the below Json Structure from three Strings SourceApplication, messagType and payload

Required Json Structure

{
    "request": {
        "header": {
            "sourceApplication": "SomeString"
            "messageType": "SomeString"
        },
        "body": {
            "payload": "SomeString"
        }
    }
}

Below is my code.

POJO Class (For mapping)

package com.test.transformer;

import java.io.Serializable;


public class JsonMapper implements Serializable {

    private Request request;

    public Request getRequest ()
    {
        return request;
    }

    public void setRequest (Request request)
    {
        this.request = request;
    }


    public static class Request implements Serializable{

        private Body body;

        private Header header;

        public Body getBody ()
        {
            return body;
        }

        public void setBody (Body body)
        {
            this.body = body;
        }

        public Header getHeader ()
        {
            return header;
        }

        public void setHeader (Header header)
        {
            this.header = header;
        }


    }

    public static class Header implements Serializable{

        private String sourceApplication;
        private String messageType;

        public String getSourceApplication ()
        {
            return sourceApplication;
        }

        public void setSourceApplication (String sourceApplication)
        {
            this.sourceApplication = sourceApplication;
        }

        public String getMessageType ()
        {
            return messageType;
        }

        public void setMessageType (String messageType)
        {
            this.messageType = messageType;
        }

    }

    public static class Body implements Serializable{

        private String payload;

        public String getPayload ()
        {
            return payload;
        }

        public void setPayload (String payload)
        {
            this.payload = payload;
        }
    }

}

My Main Class

package com.test.transformer;

import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;


public class JsonTest {

    public static  void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();


        String srcApp = "TestSrc";
        String msgType = "msgtype";
        String payload = "mainMsg";

        JsonMapper.Header h = new JsonMapper.Header();
        JsonMapper.Body b = new JsonMapper.Body();
        JsonMapper.Request r = new JsonMapper.Request();

        h.setSourceApplication(srcApp);
        h.setMessageType(msgType);
        b.setPayload(payload);

        r.setHeader(h);
        r.setBody(b);

        JsonMapper j = new JsonMapper();

        j.setRequest(r);

        String jsonInString = null;
        try {
            jsonInString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(j);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(jsonInString);
    }
}

Solution

A few things:

  • Use descriptive variable names. A common Java convention is a camelCase version of the class name such as JsonMapper jsonMapper = new JsonMapper();
  • Unwrap your classes into separate files. This makes the code much easier to read and reuse.
  • test in your package name is very unusual, and probably not intended.
  • Test classes typically have the same name as the class they test suffixed with Test, such as JsonMapperTest.
  • Tests are not written in main methods.
  • Having getters and setters for everything is a code smell – not necessarily bad, but often misused. Your application doesn’t do anything yet, so it’s difficult to tell whether any of them will be necessary, but in general I would not add getters and setters until I know I need them.

Leave a Reply

Your email address will not be published. Required fields are marked *