Java對象與JSON互相轉換jsonlib以及手動建立JSON對象與數組——(二)

    首先聲明一下,jsonlib轉換與GSON相比太差勁了,操做不是通常的繁瑣。GSON能夠直接轉換成各類集合與對象類型。強烈推薦使用GSON。並且GSON一個方法就能夠解決,jsonlib轉來轉去太繁瑣了。java

手動建立JSONObject與JSONArray有用,用於讀取文件對字符串進行處理

 

-----------------------------jsonlib操做複雜,轉換Map與list<map>更是複雜----------------

 

Jar包

User.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 }

 

 1.Java對象轉json(操做複雜)

對象類型用JSONObject,集合類型用JSONArrayjson

 

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":"山西太原"}}]
    }
    
}

 

2.JSON字符串轉Java對象與list(只測了轉bean與list)

轉出來的中間還有空格,使用時候還得去空格。太繁瑣了。數組

在將 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=山西太原]
    }
}

 

3.手動建立JSONObject與JSONArray(用於封裝JSON轉java對象與List集合)

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"}

相關文章
相關標籤/搜索