Mercurial Hosting > luan
view src/luan/modules/parsers/Json.java @ 1112:490f77bb2ad1
add JsonParser
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 02 Aug 2017 17:37:59 -0600 |
parents | 88b5b81cad4a |
children |
line wrap: on
line source
package luan.modules.parsers; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.LinkedHashMap; import java.util.Iterator; import luan.LuanTable; import luan.LuanException; import luan.lib.parser.Parser; import luan.lib.parser.ParseException; public final class Json { 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); } }