1 package org.opensrf.util;
10 public class JSONWriter {
12 /** The object to serialize to JSON */
16 * @param obj The object to encode
18 public JSONWriter(Object obj) {
24 * Encodes a java object to JSON.
26 public String write() {
27 StringBuffer sb = new StringBuffer();
35 * Encodes a java object to JSON.
36 * Maps (HashMaps, etc.) are encoded as JSON objects.
37 * Iterable's (Lists, etc.) are encoded as JSON arrays
39 public void write(StringBuffer sb) {
44 * Encodes the object as JSON into the provided buffer
46 public void write(Object obj, StringBuffer sb) {
55 if(obj instanceof String) {
57 Utils.escape((String) obj, sb);
63 if(obj instanceof Number) {
64 sb.append(obj.toString());
69 if(obj instanceof Iterable) {
70 encodeJSONArray((Iterable) obj, sb);
74 /** OpenSRF serializable objects */
75 if(obj instanceof OSRFSerializable) {
76 encodeOSRFSerializable((OSRFSerializable) obj, sb);
81 if(obj instanceof Map) {
82 encodeJSONObject((Map) obj, sb);
87 if(obj instanceof Boolean) {
88 sb.append((((Boolean) obj).booleanValue() ? "true" : "false"));
95 * Encodes a List as a JSON array
97 private void encodeJSONArray(Iterable iterable, StringBuffer sb) {
98 Iterator itr = iterable.iterator();
100 boolean some = false;
102 while(itr.hasNext()) {
104 write(itr.next(), sb);
108 /* remove the trailing comma if the array has any items*/
110 sb.deleteCharAt(sb.length()-1);
116 * Encodes a Map as a JSON object
118 private void encodeJSONObject(Map map, StringBuffer sb) {
119 Iterator itr = map.keySet().iterator();
123 while(itr.hasNext()) {
127 write(map.get(key), sb);
131 /* remove the trailing comma if the object has any items*/
133 sb.deleteCharAt(sb.length()-1);
139 * Encodes a network-serializable OpenSRF object
141 private void encodeOSRFSerializable(OSRFSerializable obj, StringBuffer sb) {
143 OSRFRegistry reg = obj.getRegistry();
144 String[] fields = reg.getFields();
145 Map<String, Object> map = new HashMap<String, Object>();
146 map.put(JSONReader.JSON_CLASS_KEY, reg.getNetClass());
148 if( reg.getWireProtocol() == OSRFRegistry.WireProtocol.ARRAY ) {
150 /** encode arrays as lists */
151 List<Object> list = new ArrayList<Object>(fields.length);
152 for(String s : fields)
153 list.add(obj.get(s));
154 map.put(JSONReader.JSON_PAYLOAD_KEY, list);
158 /** encode hashes as maps */
159 Map<String, Object> subMap = new HashMap<String, Object>();
160 for(String s : fields)
161 subMap.put(s, obj.get(s));
162 map.put(JSONReader.JSON_PAYLOAD_KEY, subMap);
166 /** now serialize the encoded object */