首先聲明一下,jsonlib轉換與GSON相比太差勁了,操做不是通常的繁瑣。GSON能夠直接轉換成各類集合與對象類型。強烈推薦使用GSON。並且GSON一個方法就能夠解決,jsonlib轉來轉去太繁瑣了。java
1 package TestJson_JSONlib; 2 3 public class User { 4 5 private String id; 6 private String name; 7 private Integer age; 8 private String address; 9 public String getId() { 10 return id; 11 } 12 public int getAge() { 13 return age; 14 } 15 16 public void setAge(Integer age) { 17 this.age = age; 18 } 19 public String getAddress() { 20 return address; 21 } 22 public void setAddress(String address) { 23 this.address = address; 24 } 25 public void setId(String id) { 26 this.id = id; 27 } 28 public String getName() { 29 return name; 30 } 31 public void setName(String name) { 32 this.name = name; 33 } 34 public User() { 35 } 36 public User(String id, String name, Integer age, String address) { 37 super(); 38 this.id = id; 39 this.name = name; 40 this.age = age; 41 this.address = address; 42 } 43 @Override 44 public String toString() { 45 return "User [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]"; 46 } 47 48 49 50 51 }
對象類型用JSONObject,集合類型用JSONArray。json
package TestJson_JSONlib; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.UnmarshallerHandler; import org.junit.Test; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Bean2JSON { // 測試單個對象轉JSON,轉單個對象用JSONObject @Test public void test1(){ User user = new User("1", "QIAOZHI",25,"山西太原"); JSONObject jsonObject = JSONObject.fromObject(user); String json = jsonObject.toString(); System.out.println(json); //{"id":"1","name":"QIAOZHI","age":25,"address":"山西太原"} } // 測試list轉JSON,轉集合用JSONArray,會產生[] @Test public void test2(){ List<User> list = new ArrayList<User>(); list.add(new User("1", "QIAOZHI",25,"山西太原")); list.add(new User("2", "QIAOZHI",25,"山西太原")); list.add(new User("3", "QIAOZHI",25,"山西太原")); JSONArray jsonArray = JSONArray.fromObject(list); String json = jsonArray.toString(); System.out.println(json); // [{"id":"1","name":"QIAOZHI","age":25,"address":"山西太原"},{"id":"2","name":"QIAOZHI","age":25,"address":"山西太原"},{"id":"3","name":"QIAOZHI","age":25,"address":"山西太原"}] } // 測試map對象轉JSON,轉單個對象用JSONObject @Test public void test3(){ Map<String,User> map = new HashMap<String,User>(); map.put("1", new User("1", "QIAOZHI",25,"山西太原")); map.put("2", new User("2", "QIAOZHI",25,"山西太原")); map.put("3", new User("3", "QIAOZHI",25,"山西太原")); JSONObject jsonObject= JSONObject.fromObject(map); String json = jsonObject.toString(); System.out.println(json); // {"3":{"address":"山西太原","age":25,"id":"3","name":"QIAOZHI"},"2":{"address":"山西太原","age":25,"id":"2","name":"QIAOZHI"},"1":{"address":"山西太原","age":25,"id":"1","name":"QIAOZHI"}} } // 測試list<map>對象轉JSON,轉集合用JSONArray,會產生[] @Test public void test4(){ List<Map<String,User>> list = new ArrayList<>(); Map<String,User> map1 = new HashMap<String,User>(); Map<String,User> map2 = new HashMap<String,User>(); map1.put("map11", new User("1", "QIAOZHI",25,"山西太原")); map1.put("map12", new User("2", "QIAOZHI",25,"山西太原")); map2.put("21", new User("11", "QIAOZHI",25,"山西太原")); map2.put("22", new User("21", "QIAOZHI",25,"山西太原")); list.add(map1); list.add(map2); JSONArray jsonArray = JSONArray.fromObject(list); String json = jsonArray.toString(); System.out.println(json); // [{"map12":{"id":"2","name":"QIAOZHI","age":25,"address":"山西太原"},"map11":{"id":"1","name":"QIAOZHI","age":25,"address":"山西太原"}},{"21":{"id":"11","name":"QIAOZHI","age":25,"address":"山西太原"},"22":{"id":"21","name":"QIAOZHI","age":25,"address":"山西太原"}}] } }
轉出來的中間還有空格,使用時候還得去空格。太繁瑣了。數組
在將 Json 形式的字符串轉換爲 JavaBean 的時候須要注意 JavaBean 中必須有無參構造函數,不然會報找不到初始化方法的錯誤。ide
package TestJson_JSONlib; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import com.google.gson.Gson; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class JSON2Bean { // 測試json轉單個對象 @Test public void test1(){ String json = "{\"id\":\"1\",\"name\":\"QIAOZHI\",\"age\":25,\"address\":\"山西太原\"}"; JSONObject jsonObject = JSONObject.fromObject(json); System.out.println(jsonObject); //產生一個json格式的json對象 // {"id":"1","name":"QIAOZHI","age":25,"address":"山西太原"} User user = (User) JSONObject.toBean(jsonObject, User.class); System.out.println(user); // User [id=1, name=QIAOZHI, age=null, address=山西太原] } // 測試JSON轉list(太反覆雜了) @SuppressWarnings("unchecked") @Test public void test2(){ String json = "[{'id':'1','name':'QIAOZHI','age':25,'address':'山西太原'},{'id':'2','name':'QIAOZHI','age':25,'address':'山西太原'},{'id':'3','name':'QIAOZHI','age':25,'address':'山西太原'}]"; List<User> list = new ArrayList<User>(); JSONArray jsonArray = JSONArray.fromObject(json); System.out.println(jsonArray); //產生一個JSON格式的數組 // [{"id":"1","name":"QIAOZHI","age":25,"address":"山西太原"},{"id":"2","name":"QIAOZHI","age":25,"address":"山西太原"},{"id":"3","name":"QIAOZHI","age":25,"address":"山西太原"}] list = (List<User>) JSONArray.toList(jsonArray,User.class); System.out.println(list); // [User [id=1, name=QIAOZHI, age=null, address=山西太原], User [id=2, name=QIAOZHI, age=null, address=山西太原], User [id=3, name=QIAOZHI, age=null, address=山西太原]] System.out.println(list.get(1)); // User [id=2, name=QIAOZHI, age=null, address=山西太原] } }
package TestJson_JSONlib; import org.junit.Test; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class CreateJSONObject { @Test public void test1(){ // 手動建立一個JSONObject JSONObject jsonObject = new JSONObject(); jsonObject.put("id", "11"); jsonObject.put("name", "qiaozhi"); jsonObject.put("age", 30); jsonObject.put("address", "山西太原"); System.out.println(jsonObject); // {"id":"11","name":"qiaozhi","age":30,"address":"山西太原"} JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("id", "12"); jsonObject1.put("name", "qiaozhi"); jsonObject1.put("age", 30); jsonObject1.put("address", "山西太原"); System.out.println(jsonObject1); // {"id":"12","name":"qiaozhi","age":30,"address":"山西太原"} // 產生一個JSONArray JSONArray jsonArray = new JSONArray(); jsonArray.add(jsonObject); jsonArray.add(jsonObject1); System.out.println(jsonArray); // [{"id":"11","name":"qiaozhi","age":30,"address":"山西太原"},{"id":"12","name":"qiaozhi","age":30,"address":"山西太原"}] // 用上述方法轉成Java對象與List集合,用於處理數據 } }
可用於手動封裝JSON對象。函數
補充:JSON字符串轉map,與map轉json字符串的測試:(其實字符轉轉map是先轉爲JSONObject再轉爲map)測試
String accessToken = FetchData.getAccessToken();//{"expires_in":7200,"errmsg":"ok","access_token":"94a50870f92230eb8ad8211b4023675c","errcode":0} //*******************************json字符串轉map //轉爲JSONObject JSONObject jsonObject = JSONObject.fromObject(accessToken); //轉爲Map Map map = (Map) JSONObject.toBean(jsonObject, Map.class); System.out.println(map); //******************************Map轉JSON字符串 JSONObject jsonStr = JSONObject.fromObject(map); System.out.println(jsonStr.toString());
結果:this
{expires_in=7200, errmsg=ok, access_token=94a50870f92230eb8ad8211b4023675c, errcode=0}
{"expires_in":7200,"errmsg":"ok","access_token":"94a50870f92230eb8ad8211b4023675c","errcode":0}google
補充:JSONArray實際上是List的子類,轉換的時候字符串以[]包裹的能夠轉爲JSONArray,並且要轉爲JSONArray必須以[ ]開始結束url
String jsonStrs = "[{\"customerId\":19,\"customerName\":\"\tXXX有限公司\"},{\"customerId\":5568,\"customerName\":\"\tXXX展有限公司\"}]"; // 字符串轉爲JSONArray,必須以[開始,以]結束 JSONArray jsonArray = JSONArray.fromObject(jsonStrs); System.out.println(jsonArray.size()); System.out.println(jsonArray.toString()); System.out.println("================================================="); for (int i = 0, length_1 = jsonArray.size(); i < length_1; i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); System.out.println(jsonObject.toString()); } // jsonArray轉list System.out.println("================================================="); List list = JSONArray.toList(jsonArray); System.out.println(list);
結果:spa
2
[{"customerId":19,"customerName":"\tXXX有限公司"},{"customerId":5568,"customerName":"\tXXX展有限公司"}]
=================================================
{"customerId":19,"customerName":"\tXXX有限公司"}
{"customerId":5568,"customerName":"\tXXX展有限公司"}
=================================================
[net.sf.ezmorph.bean.MorphDynaBean@20c8e08f[
{customerName= XXX有限公司, customerId=19}
], net.sf.ezmorph.bean.MorphDynaBean@640edd19[
{customerName= XXX展有限公司, customerId=5568}
]]
查看JSONArray源碼:
補充2:其實咱們的JSONObject就是Map,咱們將字符串轉爲JSONObject以後數據存入其內置的map中:
String returnedStr = HttpUtils.doGetWithParams(url, params);//{"errmsg":"ok","department":[{"id":1,"createDeptGroup":true,"name":"開發測試","autoAddUser":true}],"errcode":0} // *******************************json字符串轉map JSONObject jsonObject = JSONObject.fromObject(returnedStr); if (jsonObject != null && "ok".equals(jsonObject.get("errmsg"))) { return (String) jsonObject.get("department"); } return null;
結果:
[{"id":1,"createDeptGroup":true,"name":"開發測試","autoAddUser":true}]
查看源碼:
public Object get( Object key ) { if( key instanceof String ){ return get( (String) key ); } return null; } /** * Get the value object associated with a key. * * @param key A key string. * @return The object associated with the key. * @throws JSONException if this.isNull() returns true. */ public Object get( String key ) { verifyIsNull(); return this.properties.get( key ); }
若是是字符串的話調用字符串調用方法從properties中獲取值,properties是什麼?應該是個map。。。繼續查看源碼以下:
/** * The Map where the JSONObject's properties are kept. */ private Map properties;
補充2:若是從JSONObject中獲取一個不存在的key的時候會報錯,而不是返回null,查看源碼發現:
public String getString( String key ) { verifyIsNull(); Object o = get( key ); if( o != null ){ return o.toString(); } throw new JSONException( "JSONObject[" + JSONUtils.quote( key ) + "] not found." ); }
解決辦法:先判斷一下
if(jo.containsKey("tel")){ userMap.put("officePhone", jo.getString("tel")); }
而對於HashMap來講,key不存在是返回null的,源碼以下:
public V get(Object key) { if (key == null) return getForNullKey(); Entry<K,V> entry = getEntry(key); return null == entry ? null : entry.getValue(); }
總結:
1.字符串轉JSONArray的時候字符串必須是JSON數組,也就是[{},{},.....];字符串轉JSONObject必須是對象,也就是{"key":"value"...},當多個{}{}的時候只會轉一個,以下。字符串轉JSONArray或者JSONObject調用對應的fromObject(Obj)方法:
String jsonStrs = "[{\"customerId\":19,\"customerName\":\"\tXXX有限公司\"},{\"customerId\":5568,\"customerName\":\"\tXXX展有限公司\"}]"; String jsonStrs1 = "{\"customerId\":19,\"customerName\":\"\tXXX有限公司\"},{\"customerId\":5568,\"customerName\":\"\tXXX展有限公司\"}"; JSONArray fromObject = JSONArray.fromObject(jsonStrs); JSONObject fromObject1 = JSONObject.fromObject(jsonStrs1); System.out.println(fromObject.toString()); System.out.println(fromObject1.toString());
結果:
[{"customerId":19,"customerName":"\tXXX有限公司"},{"customerId":5568,"customerName":"\tXXX展有限公司"}]
{"customerId":19,"customerName":"\tXXX有限公司"}
2.JSONObject是一箇中間對象。若是操做集合調用對應的JSONArray便可。
字符串轉對象能夠先調用JSONObject.fromObject(str)轉換爲JSONObject,而後調用JSONObject.toBean(jsonObject,class)轉爲對應類型的對象
對象轉JSON字符串能夠JSONObject.fromObject(str)轉換爲JSONObject,而後調用其toString()方法便可。
Map map = new HashMap<>(); map.put("x", "x"); map.put("y", "y"); // Map轉JSON字符串(先爲JSONObject) JSONObject fromObject = JSONObject.fromObject(map);// 轉爲JSONObject String jsonStr = fromObject.toString(); System.out.println(jsonStr); System.out.println("=========================="); // JSON轉Map字符串(先轉爲JSONObject) JSONObject fromObject2 = JSONObject.fromObject(jsonStr); Map bean = (Map) JSONObject.toBean(fromObject2, Map.class); System.out.println(bean);
結果:
{"y":"y","x":"x"}
==========================
{y=y, x=x}
補充:上面的JSONObject是JSONLib下的類。若是是fastjson包下的JSONObject(alibaba的)使用更簡單,字符串轉對象與對象轉字符串以下:
toJSONString(bean)轉爲JSON串,parseObject(jsonStr,class)轉爲Bean。
Map map = new HashMap<>(); map.put("x", "x"); map.put("y", "y"); // bean轉JSON字符串 String jsonString = com.alibaba.fastjson.JSONObject.toJSONString(map); System.out.println(jsonString); // JSON字符串轉bean Map parseObject = com.alibaba.fastjson.JSONObject.parseObject(jsonString, Map.class); System.out.println(parseObject);
也能夠指定指定屬性不進行序列化,以下:
Map<String, String> map = new HashMap<>(); map.put("x", "x"); map.put("y", "y"); // 採用過濾器過濾掉指定屬性 SimplePropertyPreFilter filter = new SimplePropertyPreFilter(); filter.getExcludes().add("x"); String jsonString2 = com.alibaba.fastjson.JSONObject.toJSONString(map, filter); System.out.println(jsonString2);
結果:
{"y":"y"}