1// 生成JSON字符串工具
2import java.util.ArrayList;
3import java.util.Iterator;
4import java.util.LinkedHashMap;
5import java.util.List;
6import java.util.Map;
7
8/** *//**
9 * JSON utility class
10 *
11 * @since 2008-04-21
12 */
13public class Json {
14
15 // test
16 public static void main(String[] args) {
17 Json json1 = new Json();
18 json1.add("totalCount", 2);
19 json1.add("isTest", true);
20
21 Json json_a = new Json();
22 json_a.add("menuid", 1);
23 json_a.add("menuname", "testmenu");
24 json1.add("topics", json_a);
25
26 Json json_b = new Json();
27 json_b.add("menuid", 2);
28 json_b.add("menuname", "testmenu");
29 json1.add("topics", json_b);
30 System.out.println(json1.toString());
31 }
32
33 private Map map = new LinkedHashMap();
34
35 /** *//**
36 * 添加一个 JSON 属性,值为一个字符串,重复添加时产生数组<p/>
37 *
38 * add("name", "value");<br/>
39 * 添加一个字符串,产生的 JSON 如:{"name":"value"}<p/>
40 *
41 * add("name", "value1");<br/>
42 * add("name", "value2");<br/>
43 * 添加两个同属性的字符串,产生的 JSON 如:{"name":["value1", "value2"]}<p/>
44 *
45 * @param key JSON 属性名
46 * @param str 字符串格式的属性值
47 */
48 public void add(String key, String value) {
49 addElement(key, value);
50 }
51
52 public void add(String key, int num) {
53 addElement(key, new Integer(num));
54 }
55
56 public void add(String key, boolean b) {
57 addElement(key, new Boolean(b));
58 }
59
60 /** *//**
61 * 添加一个 JSON 属性,值为一个 JSON,重复添加时产生 JSON 数组<p/>
62 *
63 * Json json1 = new Json();<br/>
64 * json1.add("name1", "value1");<br/>
65 * json1.add("name2", "value2");<br/>
66 * Json json = new Json();<br/>
67 * json.add("message", json1);<br/>
68 * 添加一个 JSON,产生的 JSON 如:{"message":{"name1":"value1", "name2":"value2"}}<p/>
69 *
70 * Json json1 = new Json();<br/>
71 * json1.add("name1", "value1");<br/>
72 * json1.add("name2", "value2");<br/>
73 * Json json2 = new Json();<br/>
74 * json2.add("name1", "value3");<br/>
75 * json2.add("name2", "value4");<br/>
76 * Json json = new Json();<br/>
77 * json.add("message", json1);<br/>
78 * json.add("message", json2);<br/>
79 * 添加两个同属性的 JSON,产生的 JSON 如:{"message":[{"name1":"value1", "name2":"value2"}, {"name1":"value3", "name2":"value4"}]}<p/>
80 *
81 * @param key JSON 属性名
82 * @param json JSON 格式的属性值
83 */
84 public void add(String key, Json json) {
85 addElement(key, json);
86 }
87
88 public String toString() {
89 StringBuilder sb = new StringBuilder();
90 sb.append("{");
91 int k = 0;
92 for (Iterator i = map.keySet().iterator(); i.hasNext();) {
93 String key = (String)(i.next());
94 Object obj = map.get(key);
95 if (k > 0) {
96 sb.append(",");
97 }
98 appendKey(sb, key);
99 if (obj instanceof String) {
100 appendString(sb, (String)obj);
101 } else if (obj instanceof List) {
102 appendList(sb, (List)obj);
103 } else if (obj instanceof Json) {
104 appendJson(sb, (Json)obj);
105 } else {
106 appendOther(sb, obj);
107 }
108 k++;
109 }
110 sb.append("}");
111 return sb.toString();
112 }
113
114 private void addElement(String key, Object obj) {
115 if (!map.containsKey(key)) {
116 if(obj instanceof Json) {
117 List list = new ArrayList();
118 list.add(obj);
119 map.put(key, list);
120 } else {
121 map.put(key, obj);
122 }
123 return;
124 }
125
126 Object o = map.remove(key);
127
128 if (o instanceof List) {
129 ((List)o).add(obj);
130 map.put(key, o);
131 return;
132 }
133
134 // o is a String
135 List list = new ArrayList();
136 list.add(o);
137 list.add(obj);
138 map.put(key, list);
139 }
140
141 /** *//**
142 * Append JSON property name
143 *
144 * @param sb
145 * @param key
146 */
147 private void appendKey(StringBuilder sb, String key) {
148 sb.append("\"").append(key).append("\":");
149 }
150
151 /** *//**
152 * Append JSON property value that is a String
153 *
154 * @param sb
155 * @param str
156 */
157 private void appendString(StringBuilder sb, String str) {
158 sb.append("\"").append(str).append("\"");
159 }
160
161 /** *//**
162 * Append JSON property value that is a Integer
163 *
164 * @param sb
165 * @param num
166 */
167 private void appendOther(StringBuilder sb, Object obj) {
168 sb.append(obj);
169 }
170
171 /** *//**
172 * Append JSON property value that is a List
173 *
174 * @param sb
175 * @param list
176 */
177 private void appendList(StringBuilder sb, List list) {
178 sb.append("[");
179 for (int j = 0, m = list.size(); j < m; j++) {
180 if (j > 0) {
181 sb.append(",");
182 }
183 Object obj = list.get(j);
184 if (obj instanceof String) {
185 appendString(sb, (String)obj);
186 } else if (obj instanceof Json) {
187 appendJson(sb, (Json)obj);
188 } else {
189 appendOther(sb, obj);
190 }
191 }
192 sb.append("]");
193 }
194
195 /** *//**
196 * Append JSON property value that is a JSON
197 *
198 * @param sb
199 * @param json
200 */
201 private void appendJson(StringBuilder sb, Json json) {
202 sb.append(json.toString());
203 }
204}
205
posted on 2008-07-23 17:22
scea2009 阅读(4954)
评论(2) 编辑 收藏