1 package org.opensrf.util;
10 public class JSONWriter {
12 /** The object to serialize to JSON */
15 public JSONWriter(Object obj) {
21 * @see write(Object, StringBuffer)
23 public String write() {
24 StringBuffer sb = new StringBuffer();
32 * Encodes a java object to JSON.
33 * Maps (HashMaps, etc.) are encoded as JSON objects.
34 * Iterable's (Lists, etc.) are encoded as JSON arrays
36 public void write(StringBuffer sb) {
40 public void write(Object obj, StringBuffer sb) {
49 if(obj instanceof String) {
51 Utils.escape((String) obj, sb);
57 if(obj instanceof Number) {
58 sb.append(obj.toString());
63 if(obj instanceof Iterable) {
64 encodeJSONArray((Iterable) obj, sb);
68 /** OpenSRF serializable objects */
69 if(obj instanceof OSRFSerializable) {
70 encodeOSRFSerializable((OSRFSerializable) obj, sb);
75 if(obj instanceof Map) {
76 encodeJSONObject((Map) obj, sb);
81 if(obj instanceof Boolean) {
82 sb.append((((Boolean) obj).booleanValue() ? "true" : "false"));
89 * Encodes a List as a JSON array
91 private void encodeJSONArray(Iterable iterable, StringBuffer sb) {
92 Iterator itr = iterable.iterator();
96 while(itr.hasNext()) {
98 write(itr.next(), sb);
102 /* remove the trailing comma if the array has any items*/
104 sb.deleteCharAt(sb.length()-1);
110 * Encodes a Map as a JSON object
112 private void encodeJSONObject(Map map, StringBuffer sb) {
113 Iterator itr = map.keySet().iterator();
117 while(itr.hasNext()) {
121 write(map.get(key), sb);
125 /* remove the trailing comma if the object has any items*/
127 sb.deleteCharAt(sb.length()-1);
133 * Encodes a network-serializable OpenSRF object
135 private void encodeOSRFSerializable(OSRFSerializable obj, StringBuffer sb) {
137 OSRFRegistry reg = obj.getRegistry();
138 String[] fields = reg.getFields();
139 Map<String, Object> map = new HashMap<String, Object>();
140 map.put(JSONReader.JSON_CLASS_KEY, reg.getNetClass());
142 if( reg.getWireProtocol() == OSRFRegistry.WireProtocol.ARRAY ) {
144 List<Object> list = new ArrayList<Object>(fields.length);
145 for(String s : fields)
146 list.add(obj.get(s));
147 map.put(JSONReader.JSON_PAYLOAD_KEY, list);
151 Map<String, Object> subMap = new HashMap<String, Object>();
152 for(String s : fields)
153 subMap.put(s, obj.get(s));
154 map.put(JSONReader.JSON_PAYLOAD_KEY, subMap);
158 /** now serialize the encoded object */