以前转换json的时候最常用的就是jsonobject及jsonarray等常用的基本方法。但是有次转一个特别长的对象的时候速度特别慢,当时用了jackson,速度立马提升了100+
这里主要写下生成json及解析json的主要方法:
public static void generateJson() { try { JsonFactory jfactory = new JsonFactory(); JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("c:\\user.json"), JsonEncoding.UTF8); jGenerator.writeStartObject(); // { jGenerator.writeStringField("name", "mkyong"); // "name" : "mkyong" jGenerator.writeNumberField("age", 29); // "age" : 29 jGenerator.writeFieldName("messages"); // "messages" : jGenerator.writeStartArray(); // [ jGenerator.writeString("msg 1"); // "msg 1" jGenerator.writeString("msg 2"); // "msg 2" jGenerator.writeString("msg 3"); // "msg 3" jGenerator.writeEndArray(); // ] jGenerator.writeEndObject(); // } jGenerator.close(); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void analiseJson() { try { JsonFactory jfactory = new JsonFactory(); JsonParser jParser = jfactory.createJsonParser(new File("c:\\user.json")); while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("name".equals(fieldname)) { //当前结点为name jParser.nextToken(); System.out.println(jParser.getText()); // 输出 mkyong } if ("age".equals(fieldname)) { // 当前结点为age // move to next, which is "name"'s value jParser.nextToken(); System.out.println(jParser.getIntValue()); // display 29 } if ("messages".equals(fieldname)) { jParser.nextToken(); while (jParser.nextToken() != JsonToken.END_ARRAY) { // display msg1, msg2, msg3 System.out.println(jParser.getText()); } } } jParser.close(); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
参考文档:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html
http://blog.csdn.net/jackyrongvip/article/details/6689571
jsonObject的put,accumulate及element方法的区别
public Object put (Object key, Object value) 将value映射到key下。如果此JSONObject对象之前存在一个value在这个key下,当前的value会替换掉之前的value
public JSONObject accumulate (String key, Object value) 累积value到这个key下。这个方法同element()方法类似,特殊的是,如果当前已经存在一个value在这个key下那么一个JSONArray将会存储在这个key下来保存所有累积的value。如果已经存在一个JSONArray,那么当前的value就会添加到这个JSONArray中
。相比之下replace方法会替代先前的value
public JSONObject element (String key, Object value) 将键/值对放到这个JSONObject对象里面。如果当前value为空(null),那么如果这个key存在的话,这个key就会移除掉。如果这
个key之前有value值,那么此方法会调用accumulate()方法。
参考文档:http://blog.csdn.net/cocodehouse/article/details/5996088
另外对于用前端js生成一个json对象的话可以使用如下的方法:
function _ToJSON(o) { if (o == null) return "null"; switch (o.constructor) { case String: var s = o; // .encodeURI(); if (s.indexOf("}") < 0)s = '"' + s.replace(/(["\\])/g, '\\$1') + '"'; s = s.replace(/\n/g, "\\n"); s = s.replace(/\r/g, "\\r"); return s; case Array: var v = []; for (var i = 0; i < o.length; i++) v.push(_ToJSON(o[i])); if (v.length <= 0)return "\"\""; return "" + v.join(",") + ""; case Number: return isFinite(o) ? o.toString() : _ToJSON(null); case Boolean: return o.toString(); case Date: var d = new Object(); d.__type = "System.DateTime"; d.Year = o.getUTCFullYear(); d.Month = o.getUTCMonth() + 1; d.Day = o.getUTCDate(); d.Hour = o.getUTCHours(); d.Minute = o.getUTCMinutes(); d.Second = o.getUTCSeconds(); d.Millisecond = o.getUTCMilliseconds(); d.TimezoneOffset = o.getTimezoneOffset(); return _ToJSON(d); default: if (o["toJSON"] != null && typeof o["toJSON"] == "function") return o.toJSON(); if (typeof o == "object") { var v = []; for (attr in o) { if (typeof o[attr] != "function") v.push('"' + attr + '": ' + _ToJSON(o[attr])); } if (v.length > 0) return "{" + v.join(",") + "}"; else return "{}"; } alert(o.toString()); return o.toString(); } };
参考文档:http://hi.baidu.com/adnia/item/55141b5e4cd4cd13db1635d6
总结一下,这里主要介绍了jackson及jsonobject中的put和accumulate的区别。另外如何用js来生成json对象。