Mercurial Hosting > luan
diff src/luan/lib/json/JsonToString.java @ 1113:22652f4020fb
add JsonToString
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 02 Aug 2017 19:00:24 -0600 |
parents | src/luan/modules/parsers/Json.java@490f77bb2ad1 |
children | 809d74db1415 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/lib/json/JsonToString.java Wed Aug 02 19:00:24 2017 -0600 @@ -0,0 +1,110 @@ +package luan.lib.json; + +import java.util.List; +import java.util.Map; +import java.util.Iterator; + + +public final class JsonToString { + + public static final class JsonException extends RuntimeException { + private JsonException(String msg) { + super(msg); + } + } + + public static String toString(Object obj) throws JsonException { + StringBuilder sb = new StringBuilder(); + toString(obj,sb); + return sb.toString(); + } + + private static void toString(Object obj,StringBuilder sb) throws JsonException { + if( obj == null || obj instanceof Boolean || obj instanceof Number ) { + sb.append(obj); + return; + } + if( obj instanceof String ) { + toString((String)obj,sb); + return; + } + if( obj instanceof List ) { + toString((List)obj,sb); + return; + } + if( obj instanceof Map ) { + toString((Map)obj,sb); + return; + } + throw new JsonException("can't handle type "+obj.getClass().getName()); + } + + private static void toString(final String s,StringBuilder sb) { + sb.append('"'); + for( int i=0; i<s.length(); i++ ) { + char c = s.charAt(i); + switch(c) { + case '"': + sb.append("\\\""); + break; + case '\\': + sb.append("\\\\"); + break; + case '\b': + sb.append("\\b"); + break; + case '\f': + sb.append("\\f"); + break; + case '\n': + sb.append("\\n"); + break; + case '\r': + sb.append("\\r"); + break; + case '\t': + sb.append("\\t"); + break; + default: + sb.append(c); + } + } + sb.append('"'); + } + + private static void toString(List list,StringBuilder sb) { + if( list.isEmpty() ) { + sb.append("{}"); + return; + } + sb.append('['); + toString(list.get(0),sb); + for( int i=1; i<list.size(); i++ ) { + sb.append(','); + toString(list.get(i),sb); + } + sb.append(']'); + return; + } + + private static void toString(Map map,StringBuilder sb) throws JsonException { + sb.append('{'); + Iterator<Map.Entry> i = map.entrySet().iterator(); + toString(i.next(),sb); + while( i.hasNext() ) { + sb.append(','); + toString(i.next(),sb); + } + sb.append('}'); + } + + private static void toString(Map.Entry entry,StringBuilder sb) throws JsonException { + Object key = entry.getKey(); + if( !(key instanceof String) ) + throw new JsonException("table keys must be strings"); + toString((String)key,sb); + sb.append(':'); + toString(entry.getValue(),sb); + } + +}