Mercurial Hosting > luan
comparison src/luan/lib/json/JsonToString.java @ 1113:22652f4020fb
add JsonToString
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 02 Aug 2017 19:00:24 -0600 |
parents | src/luan/modules/parsers/Json.java@490f77bb2ad1 |
children | 809d74db1415 |
comparison
equal
deleted
inserted
replaced
1112:490f77bb2ad1 | 1113:22652f4020fb |
---|---|
1 package luan.lib.json; | |
2 | |
3 import java.util.List; | |
4 import java.util.Map; | |
5 import java.util.Iterator; | |
6 | |
7 | |
8 public final class JsonToString { | |
9 | |
10 public static final class JsonException extends RuntimeException { | |
11 private JsonException(String msg) { | |
12 super(msg); | |
13 } | |
14 } | |
15 | |
16 public static String toString(Object obj) throws JsonException { | |
17 StringBuilder sb = new StringBuilder(); | |
18 toString(obj,sb); | |
19 return sb.toString(); | |
20 } | |
21 | |
22 private static void toString(Object obj,StringBuilder sb) throws JsonException { | |
23 if( obj == null || obj instanceof Boolean || obj instanceof Number ) { | |
24 sb.append(obj); | |
25 return; | |
26 } | |
27 if( obj instanceof String ) { | |
28 toString((String)obj,sb); | |
29 return; | |
30 } | |
31 if( obj instanceof List ) { | |
32 toString((List)obj,sb); | |
33 return; | |
34 } | |
35 if( obj instanceof Map ) { | |
36 toString((Map)obj,sb); | |
37 return; | |
38 } | |
39 throw new JsonException("can't handle type "+obj.getClass().getName()); | |
40 } | |
41 | |
42 private static void toString(final String s,StringBuilder sb) { | |
43 sb.append('"'); | |
44 for( int i=0; i<s.length(); i++ ) { | |
45 char c = s.charAt(i); | |
46 switch(c) { | |
47 case '"': | |
48 sb.append("\\\""); | |
49 break; | |
50 case '\\': | |
51 sb.append("\\\\"); | |
52 break; | |
53 case '\b': | |
54 sb.append("\\b"); | |
55 break; | |
56 case '\f': | |
57 sb.append("\\f"); | |
58 break; | |
59 case '\n': | |
60 sb.append("\\n"); | |
61 break; | |
62 case '\r': | |
63 sb.append("\\r"); | |
64 break; | |
65 case '\t': | |
66 sb.append("\\t"); | |
67 break; | |
68 default: | |
69 sb.append(c); | |
70 } | |
71 } | |
72 sb.append('"'); | |
73 } | |
74 | |
75 private static void toString(List list,StringBuilder sb) { | |
76 if( list.isEmpty() ) { | |
77 sb.append("{}"); | |
78 return; | |
79 } | |
80 sb.append('['); | |
81 toString(list.get(0),sb); | |
82 for( int i=1; i<list.size(); i++ ) { | |
83 sb.append(','); | |
84 toString(list.get(i),sb); | |
85 } | |
86 sb.append(']'); | |
87 return; | |
88 } | |
89 | |
90 private static void toString(Map map,StringBuilder sb) throws JsonException { | |
91 sb.append('{'); | |
92 Iterator<Map.Entry> i = map.entrySet().iterator(); | |
93 toString(i.next(),sb); | |
94 while( i.hasNext() ) { | |
95 sb.append(','); | |
96 toString(i.next(),sb); | |
97 } | |
98 sb.append('}'); | |
99 } | |
100 | |
101 private static void toString(Map.Entry entry,StringBuilder sb) throws JsonException { | |
102 Object key = entry.getKey(); | |
103 if( !(key instanceof String) ) | |
104 throw new JsonException("table keys must be strings"); | |
105 toString((String)key,sb); | |
106 sb.append(':'); | |
107 toString(entry.getValue(),sb); | |
108 } | |
109 | |
110 } |