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);
+	}
+
 }