comparison src/goodjava/json/JsonToString.java @ 1402:27efb1fcbcb5

move luan.lib to goodjava
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 17 Sep 2019 01:35:01 -0400
parents src/luan/lib/json/JsonToString.java@6c8ceca4a10b
children 59fd2e8b1b9d
comparison
equal deleted inserted replaced
1401:ef1620aa99cb 1402:27efb1fcbcb5
1 package goodjava.json;
2
3 import java.util.List;
4 import java.util.Map;
5 import java.util.Iterator;
6
7
8 public 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 new JsonToString().toString(obj,sb,0);
19 sb.append('\n');
20 return sb.toString();
21 }
22
23 public static String toCompressedString(Object obj) throws JsonException {
24 StringBuilder sb = new StringBuilder();
25 JsonToString jts = new JsonToString() {
26 void indent(StringBuilder sb,int indented) {}
27 };
28 jts.toString(obj,sb,0);
29 return sb.toString();
30 }
31
32 private void toString(Object obj,StringBuilder sb,int indented) throws JsonException {
33 if( obj == null || obj instanceof Boolean || obj instanceof Number ) {
34 sb.append(obj);
35 return;
36 }
37 if( obj instanceof String ) {
38 toString((String)obj,sb);
39 return;
40 }
41 if( obj instanceof List ) {
42 toString((List)obj,sb,indented);
43 return;
44 }
45 if( obj instanceof Map ) {
46 toString((Map)obj,sb,indented);
47 return;
48 }
49 throw new JsonException("can't handle type "+obj.getClass().getName());
50 }
51
52 private static void toString(final String s,StringBuilder sb) {
53 sb.append('"');
54 for( int i=0; i<s.length(); i++ ) {
55 char c = s.charAt(i);
56 switch(c) {
57 case '"':
58 sb.append("\\\"");
59 break;
60 case '\\':
61 sb.append("\\\\");
62 break;
63 case '\b':
64 sb.append("\\b");
65 break;
66 case '\f':
67 sb.append("\\f");
68 break;
69 case '\n':
70 sb.append("\\n");
71 break;
72 case '\r':
73 sb.append("\\r");
74 break;
75 case '\t':
76 sb.append("\\t");
77 break;
78 default:
79 sb.append(c);
80 }
81 }
82 sb.append('"');
83 }
84
85 public static String javascriptEncode(String s) {
86 StringBuilder sb = new StringBuilder();
87 for( int i=0; i<s.length(); i++ ) {
88 char c = s.charAt(i);
89 switch(c) {
90 case '"':
91 sb.append("\\\"");
92 break;
93 case '\'': // added for javascript
94 sb.append("\\'");
95 break;
96 case '\\':
97 sb.append("\\\\");
98 break;
99 case '\b':
100 sb.append("\\b");
101 break;
102 case '\f':
103 sb.append("\\f");
104 break;
105 case '\n':
106 sb.append("\\n");
107 break;
108 case '\r':
109 sb.append("\\r");
110 break;
111 case '\t':
112 sb.append("\\t");
113 break;
114 default:
115 sb.append(c);
116 }
117 }
118 return sb.toString();
119 }
120
121 private void toString(List list,StringBuilder sb,int indented) {
122 sb.append('[');
123 if( !list.isEmpty() ) {
124 indent(sb,indented+1);
125 toString(list.get(0),sb,indented+1);
126 for( int i=1; i<list.size(); i++ ) {
127 sb.append(", ");
128 toString(list.get(i),sb,indented+1);
129 }
130 indent(sb,indented);
131 }
132 sb.append(']');
133 return;
134 }
135
136 private void toString(Map map,StringBuilder sb,int indented) throws JsonException {
137 sb.append('{');
138 if( !map.isEmpty() ) {
139 Iterator<Map.Entry> i = map.entrySet().iterator();
140 indent(sb,indented+1);
141 toString(i.next(),sb,indented+1);
142 while( i.hasNext() ) {
143 sb.append(',');
144 indent(sb,indented+1);
145 toString(i.next(),sb,indented+1);
146 }
147 indent(sb,indented);
148 }
149 sb.append('}');
150 }
151
152 private void toString(Map.Entry entry,StringBuilder sb,int indented) throws JsonException {
153 Object key = entry.getKey();
154 if( !(key instanceof String) )
155 throw new JsonException("table keys must be strings");
156 toString((String)key,sb);
157 sb.append(": ");
158 toString(entry.getValue(),sb,indented);
159 }
160
161 void indent(StringBuilder sb,int indented) {
162 sb.append('\n');
163 for( int i=0; i<indented; i++ ) {
164 sb.append('\t');
165 }
166 }
167
168 private JsonToString() {}
169 }