comparison 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
comparison
equal deleted inserted replaced
757:e1dfeddfbc7b 758:c29d11d675fd
2 2
3 import java.util.List; 3 import java.util.List;
4 import java.util.ArrayList; 4 import java.util.ArrayList;
5 import java.util.Map; 5 import java.util.Map;
6 import java.util.LinkedHashMap; 6 import java.util.LinkedHashMap;
7 import java.util.Iterator;
7 import luan.LuanTable; 8 import luan.LuanTable;
9 import luan.LuanException;
8 10
9 11
10 public final class Json { 12 public final class Json {
11 13
12 public static Object parse(String text) throws ParseException { 14 public static Object parse(String text) throws ParseException {
199 } 201 }
200 202
201 private void spaces() { 203 private void spaces() {
202 while( parser.anyOf(" \t\r\n") ); 204 while( parser.anyOf(" \t\r\n") );
203 } 205 }
206
207
208
209
210
211
212
213
214
215 public static String toString(Object obj) throws LuanException {
216 StringBuilder sb = new StringBuilder();
217 toString(obj,sb);
218 return sb.toString();
219 }
220
221 private static void toString(Object obj,StringBuilder sb) throws LuanException {
222 if( obj == null || obj instanceof Boolean || obj instanceof Number ) {
223 sb.append(obj);
224 return;
225 }
226 if( obj instanceof String ) {
227 toString((String)obj,sb);
228 return;
229 }
230 if( obj instanceof LuanTable ) {
231 toString((LuanTable)obj,sb);
232 return;
233 }
234 throw new LuanException("can't handle type "+obj.getClass().getName());
235 }
236
237 private static void toString(final String s,StringBuilder sb) {
238 sb.append('"');
239 for( int i=0; i<s.length(); i++ ) {
240 char c = s.charAt(i);
241 switch(c) {
242 case '"':
243 sb.append("\\\"");
244 break;
245 case '\\':
246 sb.append("\\\\");
247 break;
248 case '\b':
249 sb.append("\\b");
250 break;
251 case '\f':
252 sb.append("\\f");
253 break;
254 case '\n':
255 sb.append("\\n");
256 break;
257 case '\r':
258 sb.append("\\r");
259 break;
260 case '\t':
261 sb.append("\\t");
262 break;
263 default:
264 sb.append(c);
265 }
266 }
267 sb.append('"');
268 }
269
270 private static void toString(LuanTable t,StringBuilder sb) throws LuanException {
271 if( t.isList() ) {
272 final List list = t.asList();
273 if( list.isEmpty() ) {
274 sb.append("{}");
275 return;
276 }
277 sb.append('[');
278 toString(list.get(0),sb);
279 for( int i=1; i<list.size(); i++ ) {
280 sb.append(',');
281 toString(list.get(i),sb);
282 }
283 sb.append(']');
284 return;
285 }
286 sb.append('{');
287 Iterator<Map.Entry<Object,Object>> i = t.rawIterator();
288 toString(i.next(),sb);
289 while( i.hasNext() ) {
290 sb.append(',');
291 toString(i.next(),sb);
292 }
293 sb.append('}');
294 }
295
296 private static void toString(Map.Entry<Object,Object> entry,StringBuilder sb) throws LuanException {
297 Object key = entry.getKey();
298 if( !(key instanceof String) )
299 throw new LuanException("table keys must be strings");
300 toString((String)key,sb);
301 sb.append(':');
302 toString(entry.getValue(),sb);
303 }
304
204 } 305 }