From 937df1395c2ffab20e3f575c09e4cc75e09cea70 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 4 Dec 2019 22:55:52 +1300 Subject: [PATCH] #1882 - ENH: Add JsonContext.toJsonPretty() ... for pretty JSON output of beans and lists of beans --- .../java/io/ebean/text/json/JsonContext.java | 7 ++++++ .../server/text/json/DJsonContext.java | 24 ++++++++++++++++--- .../ebean/text/json/JsonBeanReaderTest.java | 4 ++-- .../io/ebean/text/json/JsonContextTest.java | 14 +++++++++++ .../server/text/json/WriteJsonTest.java | 16 ++++++------- 5 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/main/java/io/ebean/text/json/JsonContext.java b/src/main/java/io/ebean/text/json/JsonContext.java index 53a523275..179d5c249 100644 --- a/src/main/java/io/ebean/text/json/JsonContext.java +++ b/src/main/java/io/ebean/text/json/JsonContext.java @@ -149,6 +149,13 @@ public interface JsonContext { */ String toJson(Object value) throws JsonIOException; + /** + * Return the bean or collection as JSON string in pretty format. + * + * @throws JsonIOException When IOException occurs + */ + String toJsonPretty(Object value) throws JsonIOException; + /** * Write the bean or collection in JSON format to the writer. * diff --git a/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java b/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java index ec674cac8..6a94bd31d 100644 --- a/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java +++ b/src/main/java/io/ebeaninternal/server/text/json/DJsonContext.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.PrettyPrinter; +import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import io.ebean.FetchPath; import io.ebean.bean.EntityBean; import io.ebean.config.JsonConfig; @@ -43,6 +45,8 @@ import java.util.Set; */ public class DJsonContext implements SpiJsonContext { + private static final PrettyPrinter PRETTY_PRINTER = new Pretty(); + private final SpiEbeanServer server; private final JsonFactory jsonFactory; @@ -53,6 +57,12 @@ public class DJsonContext implements SpiJsonContext { private final DJsonScalar jsonScalar; + private static class Pretty extends DefaultPrettyPrinter { + Pretty() { + _objectFieldValueSeparatorWithSpaces = ": "; + } + } + public DJsonContext(SpiEbeanServer server, JsonFactory jsonFactory, TypeManager typeManager) { this.server = server; this.jsonFactory = (jsonFactory != null) ? jsonFactory : new JsonFactory(); @@ -289,19 +299,27 @@ public class DJsonContext implements SpiJsonContext { } } + @Override + public String toJsonPretty(Object value) throws JsonIOException { + return toJsonString(value, null, true); + } + @Override public String toJson(Object o) throws JsonIOException { - return toJsonString(o, null); + return toJsonString(o, null, false); } @Override public String toJson(Object o, JsonWriteOptions options) throws JsonIOException { - return toJsonString(o, options); + return toJsonString(o, options, false); } - private String toJsonString(Object value, JsonWriteOptions options) throws JsonIOException { + private String toJsonString(Object value, JsonWriteOptions options, boolean pretty) throws JsonIOException { StringWriter writer = new StringWriter(500); try (JsonGenerator gen = createGenerator(writer)) { + if (pretty) { + gen.setPrettyPrinter(PRETTY_PRINTER); + } toJsonInternal(value, gen, options); } catch (IOException e) { throw new JsonIOException(e); diff --git a/src/test/java/io/ebean/text/json/JsonBeanReaderTest.java b/src/test/java/io/ebean/text/json/JsonBeanReaderTest.java index 2047a0b0b..df6530e16 100644 --- a/src/test/java/io/ebean/text/json/JsonBeanReaderTest.java +++ b/src/test/java/io/ebean/text/json/JsonBeanReaderTest.java @@ -17,7 +17,7 @@ public class JsonBeanReaderTest extends BaseTestCase { static JsonContext json = Ebean.json(); @Test - public void read() throws Exception { + public void read() { JsonParser parser = getParser(); JsonBeanReader beanReader = json.createBeanReader(Customer.class, parser, null); @@ -40,7 +40,7 @@ public class JsonBeanReaderTest extends BaseTestCase { } @Test - public void forJson() throws Exception { + public void forJson() { JsonParser parser = getParser(); JsonBeanReader beanReader = json.createBeanReader(Customer.class, parser, null); diff --git a/src/test/java/io/ebean/text/json/JsonContextTest.java b/src/test/java/io/ebean/text/json/JsonContextTest.java index c8d32d269..8d099565b 100644 --- a/src/test/java/io/ebean/text/json/JsonContextTest.java +++ b/src/test/java/io/ebean/text/json/JsonContextTest.java @@ -81,6 +81,20 @@ public class JsonContextTest { } } + @Test + public void test_toJsonPretty() { + ResetBasicData.reset(); + + List orders = DB.find(Order.class) + .select("status") + .fetch("customer", "id, name") + .findList(); + + String json = DB.json().toJsonPretty(orders); + assertThat(json).contains("[ {"); + assertThat(json).contains("\"customer\": {"); + } + @Test public void test_toObject() { diff --git a/src/test/java/io/ebeaninternal/server/text/json/WriteJsonTest.java b/src/test/java/io/ebeaninternal/server/text/json/WriteJsonTest.java index 09feced94..e7950dfbc 100644 --- a/src/test/java/io/ebeaninternal/server/text/json/WriteJsonTest.java +++ b/src/test/java/io/ebeaninternal/server/text/json/WriteJsonTest.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.text.json; -import io.ebean.Ebean; +import io.ebean.DB; import io.ebean.FetchPath; import io.ebean.Query; import io.ebean.text.PathProperties; @@ -8,7 +8,6 @@ import org.junit.Test; import org.tests.model.basic.Order; import org.tests.model.basic.ResetBasicData; -import java.io.IOException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -16,22 +15,21 @@ import static org.assertj.core.api.Assertions.assertThat; public class WriteJsonTest { @Test - public void test_push() throws IOException { + public void test_push() { ResetBasicData.reset(); FetchPath fetchPath = PathProperties.parse("id,status,name,customer(id,name,billingAddress(street,city)),details(qty,product(sku,prodName))"); - Query query = Ebean.find(Order.class); + Query query = DB.find(Order.class); fetchPath.apply(query); List list = query.findList(); - String json = Ebean.json().toJson(list); - System.out.println(json); + String json = DB.json().toJsonPretty(list); - assertThat(json).contains("\"customer\":{"); - assertThat(json).contains("\"billingAddress\":{"); - assertThat(json).contains("\"details\":[{"); + assertThat(json).contains("\"customer\": {"); + assertThat(json).contains("\"billingAddress\": {"); + assertThat(json).contains("\"details\": [ {"); } }