From cf4cce0fe16b4477c72fc7f749aee2337a0b31e1 Mon Sep 17 00:00:00 2001 From: TeamworkGuy2 Date: Sat, 8 Oct 2016 21:35:34 +0000 Subject: [PATCH] 0.2.0 - Extensive refactoring of JsonStringify, instance based with methods like propName(), toArray(), toProp(), comma(), indent() to assist in building JSON output strings. Added JsonWritable interface. --- CHANGELOG.md | 15 +- README.md | 2 +- bin/json_stringify.jar | Bin 4728 -> 10593 bytes package-lib.json | 6 +- src/twg2/io/json/stringify/JsonStringify.java | 456 ++++++++++++++++-- src/twg2/io/json/stringify/JsonWritable.java | 13 + 6 files changed, 446 insertions(+), 46 deletions(-) create mode 100644 src/twg2/io/json/stringify/JsonWritable.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 52e48df..e79484c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,20 @@ This project does its best to adhere to [Semantic Versioning](http://semver.org/ -------- -###[0.1.0](N/A) - 2016-10-01 +###[0.2.0](N/A) - 2016-10-08 +#### Added +* JsonWritable interface with toJson() method for objects which can be converted to JSON +* JsonStringify comma(), append(), indent(), toArray(), toStringArray(), toArrayConsume(), toProp(), propName(), and propNameUnquoted() with various overloads for most +* A 'public static final JsonStringify inst' field to the no longer static JsonStringify as a default instance + +#### Changed +Rebuilt JsonStringify as an instanced class (but with no fields making it thread save) to allow for method chaining: +* Renamed JsonStringify toJsonProperty() -> toProperty() +* Expanded JsonStringify join*() method generic parameter types + + +-------- +###[0.1.0](https://github.com/TeamworkGuy2/JsonStringify/commit/b72db5682880abffedf4af40c08ad8d39129cc52) - 2016-10-01 #### Added * Versioning of existing code. Moved/renamed JsonWrite -> JsonStringify from jfile-io to this new library. * Renamed joinStr*() methods to join() and added 'escape' parameter diff --git a/README.md b/README.md index c70cba6..e4426a4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ JsonStringify ============== -version: 0.1.0 +version: 0.2.0 Simple static methods for stringifying data into JSON strings, properties, objects, and arrays. diff --git a/bin/json_stringify.jar b/bin/json_stringify.jar index c0c5d5746c6b75c45771af50a7ceff6abd41aaa6..a2ae070aa481e0c420e0c0c2087cb705e8323446 100644 GIT binary patch delta 9129 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 G)czmas0zLS delta 3268 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 CO7f=w diff --git a/package-lib.json b/package-lib.json index f4b83dd..192aa80 100644 --- a/package-lib.json +++ b/package-lib.json @@ -1,12 +1,12 @@ { - "version" : "0.1.0", + "version" : "0.2.0", "name" : "json-stringify", "description" : "JSON stringify helper methods to create JSON strings, properties, objects, and arrays", "homepage" : "https://github.com/TeamworkGuy2/JsonStringify", "license" : "MIT", "main" : "./bin/json_stringify.jar", "dependencies" : { - "jfunc": "*", - "jtext-util": "*" + "jfunc" : "*", + "jtext-util" : "*" } } \ No newline at end of file diff --git a/src/twg2/io/json/stringify/JsonStringify.java b/src/twg2/io/json/stringify/JsonStringify.java index 284259e..6d92dcf 100644 --- a/src/twg2/io/json/stringify/JsonStringify.java +++ b/src/twg2/io/json/stringify/JsonStringify.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.io.UncheckedIOException; +import java.util.Iterator; +import java.util.List; import twg2.functions.IoFunc; import twg2.text.stringEscape.StringEscapeJson; @@ -10,40 +12,41 @@ * @author TeamworkGuy2 * @since 2015-12-13 */ -public class JsonStringify { +public final class JsonStringify { + public static final JsonStringify inst = new JsonStringify(); - // ==== Consumer ==== - /** Sames as {@link #join(Iterable, String, boolean, StringBuilder, IoFunc.FunctionIo)} except all strings are JSON escaped first ({@link StringEscapeJson#toJsonString(String)}) + // ==== Function ==== + /** Same as {@link #join(Iterable, String, boolean, StringBuilder, IoFunc.FunctionIo)} except all strings are JSON escaped first ({@link StringEscapeJson#toJsonString(String)}) */ - public static final void joinEscape(Iterable objs, String delimiter, StringBuilder dst, IoFunc.FunctionIo toString) { - join(objs, delimiter, true, dst, toString); + public JsonStringify joinEscape(Iterable objs, String delimiter, StringBuilder dst, IoFunc.FunctionIo toString) { + return join(objs, delimiter, true, dst, toString); } /** Stringify a group of objects, but let a function convert the non-null objects to strings. All this method does is write "null" for null values, * the returned {@code toString} strings, and the separator between elements */ - public static final void join(Iterable objs, String delimiter, boolean escape, StringBuilder dst, IoFunc.FunctionIo toString) { + public JsonStringify join(Iterable objs, String delimiter, boolean escape, StringBuilder dst, IoFunc.FunctionIo toString) { try { - join(objs, delimiter, escape, (Appendable)dst, toString); + return join(objs, delimiter, escape, (Appendable)dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } - /** Sames as {@link #join(Iterable, String, boolean, Appendable, IoFunc.FunctionIo)} except all strings are JSON escaped first ({@link StringEscapeJson#toJsonString(String)}) + /** Same as {@link #join(Iterable, String, boolean, Appendable, IoFunc.FunctionIo)} except all strings are JSON escaped first ({@link StringEscapeJson#toJsonString(String)}) */ - public static final void join(Iterable objs, String delimiter, Appendable dst, IoFunc.FunctionIo toString) throws IOException { - join(objs, delimiter, true, dst, toString); + public JsonStringify join(Iterable objs, String delimiter, Appendable dst, IoFunc.FunctionIo toString) throws IOException { + return join(objs, delimiter, true, dst, toString); } /** Stringify a group of objects, but let a function convert the non-null objects to strings. All this method does is write "null" for null values, * the returned {@code toString} strings, and the separator between elements */ - public static final void join(Iterable objs, String delimiter, boolean escape, Appendable dst, IoFunc.FunctionIo toString) throws IOException { + public JsonStringify join(Iterable objs, String delimiter, boolean escape, Appendable dst, IoFunc.FunctionIo toString) throws IOException { boolean firstLoop = true; for(T obj : objs) { if(!firstLoop) { @@ -58,14 +61,15 @@ public static final void join(Iterable objs, String delimi } firstLoop = false; } + return this; } /** Stringify a group of objects, but let a consumer function write the non-null values. All this method does is write "null" for null values and the separator between elements */ - public static final void joinConsume(Iterable objs, String delimiter, StringBuilder dst, IoFunc.ConsumerIo toString) { + public JsonStringify joinConsume(Iterable objs, String delimiter, StringBuilder dst, IoFunc.ConsumerIo toString) { try { - joinConsume(objs, delimiter, (Appendable)dst, toString); + return joinConsume(objs, delimiter, (Appendable)dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } @@ -74,7 +78,7 @@ public static final void joinConsume(Iterable objs, String /** Stringify a group of objects, but let a consumer function write the non-null values. All this method does is write "null" for null values and the separator between elements */ - public static final void joinConsume(Iterable objs, String delimiter, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { + public JsonStringify joinConsume(Iterable objs, String delimiter, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { boolean firstLoop = true; for(T obj : objs) { if(!firstLoop) { @@ -88,66 +92,436 @@ public static final void joinConsume(Iterable objs, String } firstLoop = false; } + return this; } - public static final void toJsonProperty(String propName, boolean value, boolean lastProp, Appendable dst) throws IOException { - dst.append('"').append(propName).append("\": ").append(Boolean.toString(value)); - if(!lastProp) { - dst.append(", "); + // ==== to array ==== + + // object array (toString()) + public JsonStringify toStringArray(List vals, StringBuilder dst) { try { return toArray(vals, " ", true, true, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(List vals, String whitespaceSeparator, StringBuilder dst) { try { return toArray(vals, whitespaceSeparator, true, true, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(List vals, Appendable dst) throws IOException { return toArray(vals, " ", true, true, dst); } + public JsonStringify toStringArray(List vals, String whitespaceSeparator, Appendable dst) throws IOException { return toArray(vals, whitespaceSeparator, true, true, dst); } + + public JsonStringify toArray(List vals, StringBuilder dst) { try { return toArray(vals, " ", false, false, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(List vals, String whitespaceSeparator, StringBuilder dst) { try { return toArray(vals, whitespaceSeparator, false, false, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(List vals, Appendable dst) throws IOException { return toArray(vals, " ", false, false, dst); } + public JsonStringify toArray(List vals, String whitespaceSeparator, Appendable dst) throws IOException { return toArray(vals, whitespaceSeparator, false, false, dst); } + + public JsonStringify toArray(List vals, String whitespaceSeparator, boolean quote, boolean escape, Appendable dst) throws IOException { + boolean firstLoop = true; + dst.append('['); + for(int i = 0, size = vals.size(); i < size; i++) { + Object obj = vals.get(i); + if(!firstLoop) { + dst.append(',').append(whitespaceSeparator); + } + if(obj != null) { + String str = obj.toString(); + if(quote) { dst.append('"'); } + if(escape) { StringEscapeJson.toJsonString(str, 0, str.length(), dst); } + else { dst.append(str); } + if(quote) { dst.append('"'); } + } + else { + dst.append("null"); + } + firstLoop = false; } + dst.append(']'); + return this; } - public static final void toJsonProperty(String propName, int value, boolean lastProp, Appendable dst) throws IOException { - dst.append('"').append(propName).append("\": ").append(Integer.toString(value)); - if(!lastProp) { - dst.append(", "); + public JsonStringify toStringArray(Iterable vals, StringBuilder dst) { try { return toArray(vals.iterator(), " ", true, true, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(Iterable vals, String whitespaceSeparator, StringBuilder dst) { try { return toArray(vals.iterator(), whitespaceSeparator, true, true, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(Iterable vals, Appendable dst) throws IOException { return toArray(vals.iterator(), " ", true, true, dst); } + public JsonStringify toStringArray(Iterable vals, String whitespaceSeparator, Appendable dst) throws IOException { return toArray(vals.iterator(), whitespaceSeparator, true, true, dst); } + + public JsonStringify toArray(Iterable vals, StringBuilder dst) { try { return toArray(vals.iterator(), " ", false, false, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(Iterable vals, String whitespaceSeparator, StringBuilder dst) { try { return toArray(vals.iterator(), whitespaceSeparator, false, false, dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(Iterable vals, Appendable dst) throws IOException { return toArray(vals.iterator(), " ", false, false, dst); } + public JsonStringify toArray(Iterable vals, String whitespaceSeparator, Appendable dst) throws IOException { return toArray(vals.iterator(), whitespaceSeparator, false, false, dst); } + + public JsonStringify toArray(Iterator vals, String whitespaceSeparator, boolean quote, boolean escape, Appendable dst) throws IOException { + boolean firstLoop = true; + dst.append('['); + while(vals.hasNext()) { + if(!firstLoop) { + dst.append(',').append(whitespaceSeparator); + } + Object obj = vals.next(); + if(obj != null) { + String str = obj.toString(); + if(quote) { dst.append('"'); } + if(escape) { StringEscapeJson.toJsonString(str, 0, str.length(), dst); } + else { dst.append(str); } + if(quote) { dst.append('"'); } + } + else { + dst.append("null"); + } + firstLoop = false; + } + dst.append(']'); + return this; + } + + + // object array Function + public JsonStringify toStringArray(List vals, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals, " ", true, true, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(List vals, String whitespaceSeparator, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals, whitespaceSeparator, true, true, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(List vals, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals, " ", true, true, dst, toString); } + public JsonStringify toStringArray(List vals, String whitespaceSeparator, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals, whitespaceSeparator, true, true, dst, toString); } + + public JsonStringify toArray(List vals, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals, " ", false, false, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(List vals, String whitespaceSeparator, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals, whitespaceSeparator, false, false, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(List vals, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals, " ", false, false, dst, toString); } + public JsonStringify toArray(List vals, String whitespaceSeparator, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals, whitespaceSeparator, false, false, dst, toString); } + + public JsonStringify toArray(List vals, String whitespaceSeparator, + boolean quote, boolean escape, Appendable dst, IoFunc.FunctionIo toString) throws IOException { + boolean firstLoop = true; + dst.append('['); + for(int i = 0, size = vals.size(); i < size; i++) { + T obj = vals.get(i); + if(!firstLoop) { + dst.append(',').append(whitespaceSeparator); + } + if(obj != null) { + String str = toString.apply(obj); + if(quote) { dst.append('"'); } + if(escape) { StringEscapeJson.toJsonString(str, 0, str.length(), dst); } + else { dst.append(str); } + if(quote) { dst.append('"'); } + } + else { + dst.append("null"); + } + firstLoop = false; } + dst.append(']'); + return this; } - public static final void toJsonProperty(String propName, float value, boolean lastProp, Appendable dst) throws IOException { - dst.append('"').append(propName).append("\": ").append(Float.toString(value)); - if(!lastProp) { - dst.append(", "); + public JsonStringify toStringArray(Iterable vals, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals.iterator(), " ", true, true, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(Iterable vals, String whitespaceSeparator, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals.iterator(), whitespaceSeparator, true, true, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toStringArray(Iterable vals, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals.iterator(), " ", true, true, dst, toString); } + public JsonStringify toStringArray(Iterable vals, String whitespaceSeparator, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals.iterator(), whitespaceSeparator, true, true, dst, toString); } + + public JsonStringify toArray(Iterable vals, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals.iterator(), " ", false, false, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(Iterable vals, String whitespaceSeparator, StringBuilder dst, IoFunc.FunctionIo toString) { try { return toArray(vals.iterator(), whitespaceSeparator, false, false, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArray(Iterable vals, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals.iterator(), " ", false, false, dst, toString); } + public JsonStringify toArray(Iterable vals, String whitespaceSeparator, Appendable dst, IoFunc.FunctionIo toString) throws IOException { return toArray(vals.iterator(), whitespaceSeparator, false, false, dst, toString); } + + public JsonStringify toArray(Iterator vals, String whitespaceSeparator, + boolean quote, boolean escape, Appendable dst, IoFunc.FunctionIo toString) throws IOException { + boolean firstLoop = true; + dst.append('['); + while(vals.hasNext()) { + if(!firstLoop) { + dst.append(',').append(whitespaceSeparator); + } + T obj = vals.next(); + if(obj != null) { + String str = toString.apply(obj); + if(quote) { dst.append('"'); } + if(escape) { StringEscapeJson.toJsonString(str, 0, str.length(), dst); } + else { dst.append(str); } + if(quote) { dst.append('"'); } + } + else { + dst.append("null"); + } + firstLoop = false; } + dst.append(']'); + return this; } - public static final void toJsonProperty(String propName, long value, boolean lastProp, Appendable dst) throws IOException { - dst.append('"').append(propName).append("\": ").append(Long.toString(value)); - if(!lastProp) { - dst.append(", "); + // object array Consumer + public JsonStringify toArrayConsume(List vals, StringBuilder dst, IoFunc.ConsumerIo toString) { try { return toArrayConsume(vals, " ", (Appendable)dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArrayConsume(List vals, String whitespaceSeparator, StringBuilder dst, IoFunc.ConsumerIo toString) { try { return toArrayConsume(vals, whitespaceSeparator, (Appendable)dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + + public JsonStringify toArrayConsume(List vals, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { return toArrayConsume(vals, " ", dst, toString); } + public JsonStringify toArrayConsume(List vals, String whitespaceSeparator, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { + boolean firstLoop = true; + dst.append('['); + for(int i = 0, size = vals.size(); i < size; i++) { + T obj = vals.get(i); + if(!firstLoop) { + dst.append(',').append(whitespaceSeparator); + } + if(obj != null) { + toString.accept(obj); + } + else { + dst.append("null"); + } + firstLoop = false; } + dst.append(']'); + return this; } - public static final void toJsonProperty(String propName, double value, boolean lastProp, Appendable dst) throws IOException { - dst.append('"').append(propName).append("\": ").append(Double.toString(value)); - if(!lastProp) { - dst.append(", "); + public JsonStringify toArrayConsume(Iterable vals, StringBuilder dst, IoFunc.ConsumerIo toString) { try { return toArrayConsume(vals.iterator(), " ", dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toArrayConsume(Iterable vals, String whitespaceSeparator, StringBuilder dst, IoFunc.ConsumerIo toString) { try { return toArrayConsume(vals.iterator(), whitespaceSeparator, dst, toString); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + + public JsonStringify toArrayConsume(Iterable vals, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { return toArrayConsume(vals.iterator(), " ", dst, toString); } + public JsonStringify toArrayConsume(Iterable vals, String whitespaceSeparator, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { return toArrayConsume(vals.iterator(), whitespaceSeparator, dst, toString); } + + public JsonStringify toArrayConsume(Iterator vals, String whitespaceSeparator, Appendable dst, IoFunc.ConsumerIo toString) throws IOException { + boolean firstLoop = true; + dst.append('['); + while(vals.hasNext()) { + if(!firstLoop) { + dst.append(',').append(whitespaceSeparator); + } + T obj = vals.next(); + if(obj != null) { + toString.accept(obj); + } + else { + dst.append("null"); + } + firstLoop = false; } + dst.append(']'); + return this; } - public static final void toJsonProperty(String propName, char value, boolean lastProp, Appendable dst) throws IOException { + // int array + public JsonStringify toArray(int[] vals, Appendable dst) throws IOException { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(int[] vals, int off, int len, Appendable dst) throws IOException { + dst.append('['); + if(len > 0) { + dst.append(Integer.toString(vals[off])); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(Integer.toString(vals[i])); + } + } + dst.append(']'); + return this; + } + + + public JsonStringify toArray(int[] vals, StringBuilder dst) { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(int[] vals, int off, int len, StringBuilder dst) { + dst.append('['); + if(len > 0) { + dst.append(vals[off]); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(vals[i]); + } + } + dst.append(']'); + return this; + } + + + // float array + public JsonStringify toArray(float[] vals, Appendable dst) throws IOException { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(float[] vals, int off, int len, Appendable dst) throws IOException { + dst.append('['); + if(len > 0) { + dst.append(Float.toString(vals[off])); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(Float.toString(vals[i])); + } + } + dst.append(']'); + return this; + } + + + public JsonStringify toArray(float[] vals, StringBuilder dst) { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(float[] vals, int off, int len, StringBuilder dst) { + dst.append('['); + if(len > 0) { + dst.append(vals[off]); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(vals[i]); + } + } + dst.append(']'); + return this; + } + + + // long array + public JsonStringify toArray(long[] vals, Appendable dst) throws IOException { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(long[] vals, int off, int len, Appendable dst) throws IOException { + dst.append('['); + if(len > 0) { + dst.append(Long.toString(vals[off])); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(Long.toString(vals[i])); + } + } + dst.append(']'); + return this; + } + + + public JsonStringify toArray(long[] vals, StringBuilder dst) { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(long[] vals, int off, int len, StringBuilder dst) { + dst.append('['); + if(len > 0) { + dst.append(vals[off]); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(vals[i]); + } + } + dst.append(']'); + return this; + } + + + // double array + public JsonStringify toArray(double[] vals, Appendable dst) throws IOException { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(double[] vals, int off, int len, Appendable dst) throws IOException { + dst.append('['); + if(len > 0) { + dst.append(Double.toString(vals[off])); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(Double.toString(vals[i])); + } + } + dst.append(']'); + return this; + } + + + public JsonStringify toArray(double[] vals, StringBuilder dst) { return toArray(vals, 0, vals.length, dst); } + public JsonStringify toArray(double[] vals, int off, int len, StringBuilder dst) { + dst.append('['); + if(len > 0) { + dst.append(vals[off]); + for(int i = off + 1, size = off + len; i < size; i++) { + dst.append(',').append(' ').append(vals[i]); + } + } + dst.append(']'); + return this; + } + + + // ==== to 'prop: value' string ==== + public JsonStringify propName(String propName, StringBuilder dst) { dst.append('"').append(propName).append("\": "); return this; } + public JsonStringify propName(String propName, Appendable dst) throws IOException { dst.append('"').append(propName).append("\": "); return this; } + + public JsonStringify propNameUnquoted(String propName, StringBuilder dst) { dst.append(propName).append(": "); return this; } + public JsonStringify propNameUnquoted(String propName, Appendable dst) throws IOException { dst.append(propName).append(": "); return this; } + + + // ==== to 'prop: value' string ==== + public JsonStringify toProp(String propName, boolean value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, boolean value, Appendable dst) throws IOException { + propName(propName, dst); + dst.append(Boolean.toString(value)); + return this; + } + + + public JsonStringify toProp(String propName, int value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, int value, Appendable dst) throws IOException { + propName(propName, dst); + dst.append(Integer.toString(value)); + return this; + } + + + public JsonStringify toProp(String propName, float value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, float value, Appendable dst) throws IOException { + propName(propName, dst); + dst.append(Float.toString(value)); + return this; + } + + + public JsonStringify toProp(String propName, long value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, long value, Appendable dst) throws IOException { + propName(propName, dst); + dst.append(Long.toString(value)); + return this; + } + + + public JsonStringify toProp(String propName, double value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, double value, Appendable dst) throws IOException { + propName(propName, dst); + dst.append(Double.toString(value)); + return this; + } + + + public JsonStringify toProp(String propName, char value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, char value, Appendable dst) throws IOException { dst.append('"').append(propName).append("\": \""); StringEscapeJson.toJsonString(value, dst); dst.append('"'); - if(!lastProp) { - dst.append(", "); - } + return this; } - public static final void toJsonProperty(String propName, String value, boolean lastProp, Appendable dst) throws IOException { + public JsonStringify toProp(String propName, String value, StringBuilder dst) { try { return toProp(propName, value, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify toProp(String propName, String value, Appendable dst) throws IOException { dst.append('"').append(propName).append("\": \""); StringEscapeJson.toJsonString(value, 0, value.length(), dst); dst.append('"'); - if(!lastProp) { - dst.append(", "); + return this; + } + + + // ==== comma separator ==== + public JsonStringify comma( StringBuilder dst) { dst.append(',').append(' '); return this; } + public JsonStringify comma(char whitespace, StringBuilder dst) { dst.append(',').append(whitespace); return this; } + public JsonStringify comma(String whitespace, StringBuilder dst) { dst.append(',').append(whitespace); return this; } + + public JsonStringify comma( Appendable dst) throws IOException { dst.append(',').append(' '); return this; } + public JsonStringify comma(char whitespace, Appendable dst) throws IOException { dst.append(',').append(whitespace); return this; } + public JsonStringify comma(String whitespace, Appendable dst) throws IOException { dst.append(',').append(whitespace); return this; } + + public JsonStringify comma( boolean inline, StringBuilder dst) { return comma(true, inline, dst); } + public JsonStringify comma(boolean includeComma, boolean inline, StringBuilder dst) { try { return comma(includeComma, inline, (Appendable)dst); } catch(IOException ioe) { throw new UncheckedIOException(ioe); } } + public JsonStringify comma( boolean inline, Appendable dst) throws IOException { return comma(true, inline, dst); } + public JsonStringify comma(boolean includeComma, boolean inline, Appendable dst) throws IOException { + if(includeComma) { + dst.append(inline ? ", " : ",\n"); } + else if(!inline) { + dst.append("\n"); + } + return this; } + + // ==== indent ==== + public JsonStringify indent(char indent, StringBuilder dst) { dst.append(indent); return this; } + public JsonStringify indent(char indent, Appendable dst) throws IOException { dst.append(indent); return this; } + + public JsonStringify indent(char indent, int repeat, StringBuilder dst) { for(int i = 0; i < repeat; i++) { dst.append(indent); } return this; } + public JsonStringify indent(char indent, int repeat, Appendable dst) throws IOException { for(int i = 0; i < repeat; i++) { dst.append(indent); } return this; } + + public JsonStringify indent(String indent, StringBuilder dst) { dst.append(indent); return this; } + public JsonStringify indent(String indent, Appendable dst) throws IOException { dst.append(indent); return this; } + + public JsonStringify indent(String indent, int repeat, StringBuilder dst) { for(int i = 0; i < repeat; i++) { dst.append(indent); } return this; } + public JsonStringify indent(String indent, int repeat, Appendable dst) throws IOException { for(int i = 0; i < repeat; i++) { dst.append(indent); } return this; } + + + // ==== append ==== + public JsonStringify append(char ch, StringBuilder dst) { dst.append(ch); return this; } + public JsonStringify append(char ch, Appendable dst) throws IOException { dst.append(ch); return this; } + + public JsonStringify append(String str, StringBuilder dst) { dst.append(str); return this; } + public JsonStringify append(String str, Appendable dst) throws IOException { dst.append(str); return this; } + + public JsonStringify append(String str, int start, int end, StringBuilder dst) { dst.append(str, start, end); return this; } + public JsonStringify append(String str, int start, int end, Appendable dst) throws IOException { dst.append(str, start, end); return this; } } diff --git a/src/twg2/io/json/stringify/JsonWritable.java b/src/twg2/io/json/stringify/JsonWritable.java new file mode 100644 index 0000000..61c8131 --- /dev/null +++ b/src/twg2/io/json/stringify/JsonWritable.java @@ -0,0 +1,13 @@ +package twg2.io.json.stringify; + +import java.io.IOException; + +/** An object which can written itself in JSON format to an {@link Appendable} destination + * @author TeamworkGuy2 + * @since 2016-10-06 + */ +public interface JsonWritable { + + public void toJson(Appendable dst, T params) throws IOException; + +}