added initial opensrf stack layer objects. more tuning/testing of the jabber layer
[OpenSRF.git] / src / java / org / opensrf / util / JSON.java
1 package org.opensrf.util;
2
3 import java.io.*;
4 import java.util.*;
5
6 /**
7  * JSON utilities.
8  */
9 public class JSON {
10
11     public static final String JSON_CLASS_KEY = "__c";
12     public static final String JSON_PAYLOAD_KEY = "__p";
13
14
15     /**
16      * @see toJSON(Object, StringBuffer)
17      */
18     public static String toJSON(Object obj) {
19         StringBuffer sb = new StringBuffer();
20         toJSON(obj, sb);
21         return sb.toString();
22     }
23
24
25     /**
26      * Encodes a java object to JSON.
27      * Maps (HashMaps, etc.) are encoded as JSON objects.  
28      * Iterable's (Lists, etc.) are encoded as JSON arrays
29      */
30     public static void toJSON(Object obj, StringBuffer sb) {
31
32         /** JSON null */
33         if(obj == null) {
34             sb.append("null");
35             return;
36         }
37
38         /** JSON string */
39         if(obj instanceof String) {
40             sb.append('"');
41             Utils.escape((String) obj, sb);
42             sb.append('"');
43             return;
44         }
45
46         /** JSON number */
47         if(obj instanceof Number) {
48             sb.append(obj.toString());
49             return;
50         }
51
52         /** JSON array */
53         if(obj instanceof Iterable) {
54             encodeJSONArray((Iterable) obj, sb);
55             return;
56         }
57
58         /** JSON object */
59         if(obj instanceof Map) {
60             encodeJSONObject((Map) obj, sb);
61             return;
62         }
63
64         /** JSON boolean */
65         if(obj instanceof Boolean) {
66             sb.append((((Boolean) obj).booleanValue() ? "true" : "false"));
67             return;
68         }
69     }
70
71
72     /**
73      * Encodes a List as a JSON array
74      */
75     private static void encodeJSONArray(Iterable iterable, StringBuffer sb) {
76         Iterator itr = iterable.iterator();
77         sb.append("[");
78         boolean some = false;
79
80         while(itr.hasNext()) {
81             some = true;
82             toJSON(itr.next(), sb);
83             sb.append(',');
84         }
85
86         /* remove the trailing comma if the array has any items*/
87         if(some) 
88             sb.deleteCharAt(sb.length()-1); 
89         sb.append("]");
90     }
91
92
93     /**
94      * Encodes a Map to a JSON object
95      */
96     private static void encodeJSONObject(Map map, StringBuffer sb) {
97         Iterator itr = map.keySet().iterator();
98         sb.append("{");
99         Object key = null;
100
101         while(itr.hasNext()) {
102             key = itr.next();
103             toJSON(key, sb);
104             sb.append(':');
105             toJSON(map.get(key), sb);
106             sb.append(',');
107         }
108
109         /* remove the trailing comma if the object has any items*/
110         if(key != null) 
111             sb.deleteCharAt(sb.length()-1); 
112         sb.append("}");
113     }
114 }
115
116
117