Mercurial Hosting > luan
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 } |