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 }