4

I have tested below example before I do my exact task of converting Java Objects to JSON.

Converting Java objects to JSON with Jackson

And I was looking for the better performance (Converting time should be very less).

This article is showing the stats for the performance in between different APIs from this answer.

My finding was for example with the first link that I mentioned (with few records):

        ValueData object = new ValueData();
        List<ValueItems> information = new ArrayList<ValueItems>();

        ValueItems v1 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat1", 1, "data1");
        ValueItems v2 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat2", 2, "data2");
        ValueItems v3 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat3", 3, "data3");
        ValueItems v4 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat4", 4, "data4");
        ValueItems v5 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat5", 5, "data5");
        ValueItems v6 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat6", 6, "data6");
        ValueItems v7 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat7", 7, "data7");

        information.add(v1);
        information.add(v2);
        information.add(v3);
        information.add(v4);
        information.add(v5);
        information.add(v6);
        information.add(v7);

        object.setInformation(information);

And I'm going to convert this object by using Jackson:

    long smili = Calendar.getInstance().getTimeInMillis();

    ObjectWriter ow = new      ObjectMapper().writer().withDefaultPrettyPrinter();
    String json = ow.writeValueAsString(object);
    long emili = Calendar.getInstance().getTimeInMillis();
    System.out.println("taken time using jackson = " + (emili - smili) + " milli seconds");

And now I'm doing by using StringBuilder:

    smili = Calendar.getInstance().getTimeInMillis();
    StringBuilder sb = new StringBuilder();
    sb.append("{\n\"information\" : [\n");

        for (ValueItems vi : object.getInformation()) {
            sb.append("{\n\"timestamp\" : \""+vi.getTimestamp()+"\",");
            sb.append("\"feature\" : \""+vi.getFeature()+"\",");
            sb.append("\"ean\" : "+vi.getEan()+",");
            sb.append("\"data\" : \""+vi.getData()+"\"\n},");               
        }

        sb.deleteCharAt(sb.length() - 1);
        sb.append("]\n}");
     emili = Calendar.getInstance().getTimeInMillis();
     System.out.println("taken time using StringBuilder = " + (emili - smili) + " milli seconds");

I got the timing as given below just for the list size 7:

taken time using jackson = 534 milli seconds
taken time using StringBuilder = 1 milli seconds

I want to convert the object with the information list size more than 10k but the time should be very less.

  1. Creating JSON buy using StringBuilder will help in this case?
  2. Is there other API gives the facility that I require?

Please help me on this.

Community
  • 1
  • 1
Estimate
  • 1,421
  • 1
  • 18
  • 31
  • Good Q, somebody more knowledgable then me will answer about performance, but look at the difference between your StringBuilder code and the code using Jackson. The Jackson implementation is much more maintainable and the StringBuilder code would get insane if you started nesting objects other than strings. Jackson allows you to separate de/serialization concerns from your code as much as possible. – Sam Berry Jun 28 '15 at 21:59
  • 1
    Check out [Afterburner](https://github.com/FasterXML/jackson-module-afterburner) for increased performance. – Sam Berry Jun 28 '15 at 22:01
  • thanks @SamB. `AfterBurner` is efficient than `StringBuilder`. But still i'm looking for better one because this is efficient for large data but for small size I found that `StringBuilder` is better (if we are not considering serialization or deserialization) – Estimate Jun 29 '15 at 04:32

1 Answers1

6

Thanks Sam B.

I have tried with jakson-afterburner:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new AfterburnerModule());
ow = mapper.writer().withDefaultPrettyPrinter();
json = ow.writeValueAsString(object);

And I have tested with list sizes 7, 7000, 70000 and 700000:

timing was:

For 7:

taken time using jackson = 217 milli seconds
taken time using StringBuilder = 1 milli seconds
taken time using after-burner = 25 milli seconds

For 7000:

taken time using jackson = 310 milli seconds
taken time using StringBuilder = 31 milli seconds
taken time using after-burner = 65 milli seconds

For 70000:

taken time using jackson = 469 milli seconds
taken time using StringBuilder = 149 milli seconds
taken time using after-burner = 101 milli seconds

For 700000:

taken time using jackson = 1120 milli seconds
taken time using StringBuilder = 705 milli seconds
taken time using after-burner = 623 milli seconds

When the list size increases, afterburner is efficient.

Estimate
  • 1,421
  • 1
  • 18
  • 31