Mercurial Hosting > luan
diff core/src/luan/modules/parsers/Json.java @ 758:c29d11d675fd
added Json.toString() and rpc now sends tables as json
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 19 Jul 2016 00:57:37 -0600 |
parents | bdd766df1c17 |
children | ae612dfc57cb |
line wrap: on
line diff
--- a/core/src/luan/modules/parsers/Json.java Mon Jul 18 20:18:02 2016 -0600 +++ b/core/src/luan/modules/parsers/Json.java Tue Jul 19 00:57:37 2016 -0600 @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.Map; import java.util.LinkedHashMap; +import java.util.Iterator; import luan.LuanTable; +import luan.LuanException; public final class Json { @@ -201,4 +203,103 @@ private void spaces() { while( parser.anyOf(" \t\r\n") ); } + + + + + + + + + + public static String toString(Object obj) throws LuanException { + StringBuilder sb = new StringBuilder(); + toString(obj,sb); + return sb.toString(); + } + + private static void toString(Object obj,StringBuilder sb) throws LuanException { + 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 LuanTable ) { + toString((LuanTable)obj,sb); + return; + } + throw new LuanException("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(LuanTable t,StringBuilder sb) throws LuanException { + if( t.isList() ) { + final List list = t.asList(); + 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; + } + sb.append('{'); + Iterator<Map.Entry<Object,Object>> i = t.rawIterator(); + toString(i.next(),sb); + while( i.hasNext() ) { + sb.append(','); + toString(i.next(),sb); + } + sb.append('}'); + } + + private static void toString(Map.Entry<Object,Object> entry,StringBuilder sb) throws LuanException { + Object key = entry.getKey(); + if( !(key instanceof String) ) + throw new LuanException("table keys must be strings"); + toString((String)key,sb); + sb.append(':'); + toString(entry.getValue(),sb); + } + }