From 10535bb2193b40a17dda1c113023eac362175d10 Mon Sep 17 00:00:00 2001 From: Markus Hettich Date: Thu, 2 Jun 2022 21:09:43 +0200 Subject: [PATCH] Add method to write json to Writer --- src/java/mjson/Json.java | 57 ++++++++++++++++++++++++- src/test/java/testmjson/TestWriter.java | 24 +++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/test/java/testmjson/TestWriter.java diff --git a/src/java/mjson/Json.java b/src/java/mjson/Json.java index 8d543bf..eaa99d7 100755 --- a/src/java/mjson/Json.java +++ b/src/java/mjson/Json.java @@ -19,6 +19,8 @@ package mjson; import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; import java.math.BigDecimal; import java.math.BigInteger; import java.net.URI; @@ -252,7 +254,7 @@ * @author Borislav Iordanov * @version 2.0.0 */ -public class Json implements java.io.Serializable, Iterable +public abstract class Json implements java.io.Serializable, Iterable { private static final long serialVersionUID = 1L; @@ -425,6 +427,8 @@ public static interface Schema */ //Json generate(Json options); } + + public abstract void write(Writer writer) throws IOException; @Override public Iterator iterator() @@ -1893,6 +1897,10 @@ static class NullJson extends Json public Object getValue() { return null; } public Json dup() { return new NullJson(); } public boolean isNull() { return true; } + public void write(Writer writer) throws IOException + { + writer.write("null"); + } public String toString() { return "null"; } public List asList() { return (List)Collections.singletonList(null); } @@ -1975,8 +1983,11 @@ static class BooleanJson extends Json public Json dup() { return new BooleanJson(val, null); } public boolean asBoolean() { return val; } public boolean isBoolean() { return true; } + public void write(Writer writer) throws IOException + { + writer.write(val ? "true" : "false"); + } public String toString() { return val ? "true" : "false"; } - @SuppressWarnings("unchecked") public List asList() { return (List)(List)Collections.singletonList(val); } public int hashCode() { return val ? 1 : 0; } @@ -2021,6 +2032,10 @@ static class StringJson extends Json @SuppressWarnings("unchecked") public List asList() { return (List)(List)Collections.singletonList(val); } + public void write(Writer writer) throws IOException + { + writer.write('"' + escaper.escapeJsonString(val) + '"'); + } public String toString() { return '"' + escaper.escapeJsonString(val) + '"'; @@ -2032,6 +2047,7 @@ public String toString(int maxCharacters) else return '"' + escaper.escapeJsonString(val.subSequence(0, maxCharacters)) + "...\""; } + public int hashCode() { return val.hashCode(); } public boolean equals(Object x) @@ -2076,6 +2092,10 @@ static class NumberJson extends Json @SuppressWarnings("unchecked") public List asList() { return (List)(List)Collections.singletonList(val); } + public void write(Writer writer) throws IOException + { + writer.write(val.toString()); + } public String toString() { return val.toString(); } public int hashCode() { return val.hashCode(); } public boolean equals(Object x) @@ -2291,6 +2311,18 @@ public Json delAt(int index) return this; } + public void write(Writer writer) throws IOException + { + writer.write("["); + for (Iterator i = L.iterator(); i.hasNext(); ) + { + Json value = i.next(); + value.write(writer); + if (i.hasNext()) + writer.write(","); + } + writer.write("]"); + } public String toString() { return toString(Integer.MAX_VALUE); @@ -2301,6 +2333,7 @@ public String toString(int maxCharacters) return toStringImpl(maxCharacters, new IdentityHashMap()); } + String toStringImpl(int maxCharacters, Map done) { StringBuilder sb = new StringBuilder("["); @@ -2468,6 +2501,25 @@ public Map asMap() @Override public Map asJsonMap() { return object; } + public void write(Writer writer) throws IOException + { + writer.write("{"); + for (Iterator> i = object.entrySet().iterator(); i.hasNext(); ) + { + Map.Entry entry = i.next(); + String key = entry.getKey(); + Json value = entry.getValue(); + writer.append('"'); + writer.append(escaper.escapeJsonString(key)); + writer.write('"'); + writer.write(":"); + value.write(writer); + if (i.hasNext()) + writer.write(","); + } + writer.write("}"); + } + public String toString() { return toString(Integer.MAX_VALUE); @@ -2508,6 +2560,7 @@ String toStringImpl(int maxCharacters, Map done) sb.append("}"); return sb.toString(); } + public int hashCode() { return object.hashCode(); } public boolean equals(Object x) { diff --git a/src/test/java/testmjson/TestWriter.java b/src/test/java/testmjson/TestWriter.java new file mode 100644 index 0000000..24b6f99 --- /dev/null +++ b/src/test/java/testmjson/TestWriter.java @@ -0,0 +1,24 @@ +package testmjson; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.StringWriter; + +import org.junit.Test; + +import mjson.Json; + +public class TestWriter +{ + @Test + public void testWrite() throws IOException + { + String jsonString = TestSchemas.readTextResource("/suite/additionalProperties.json"); + Json json = Json.read(jsonString); + StringWriter writer = new StringWriter(); + json.write(writer); + assertEquals(json.toString(), writer.toString()); + } + +}