1. 程式人生 > >json字串轉java實體類

json字串轉java實體類

本文參考自大神部落格:點選開啟連結

一、json強轉實體類

1.實體類


package test;  
  
public class PassPortForLendsEntity {  
    private String passportid;  
    private String name;  
    private String xx;  
    private String ss;  
    public String getPassportid() {  
        return passportid;  
    }  
    public void setPassportid(String passportid) {  
        this.passportid = passportid;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getPassporttype1() {  
        return xx;  
    }  
    public void setPassporttype1(String passporttype) {  
        this.xx = passporttype;  
    }  
    public String getXx() {  
        return xx;  
    }  
    public void setXx(String xx) {  
        this.xx = xx;  
    }  
    public String getSs() {  
        return ss;  
    }  
    public void setSs(String ss) {  
        this.ss = ss;  
    }  
      
}  


2.測試類

package test;  
  
import java.util.ArrayList;  
import java.util.List;  
  
import com.alibaba.fastjson.JSON;  
import com.alibaba.fastjson.JSONArray;  
import com.alibaba.fastjson.JSONObject;  
  
public class json2entity1 {  
    public static void main(String[] args) {  
    String  str ="{\"lendperson\":\"李四\",\"lendcompany\":\"有限公司\",\"checkperson\":\"李四\","  
                + "\"lenddate\":\"2010-07-19T00:00:00\",\"lendcounts\":4,\""  
  
                +"passports\":[{\"passportid\":\"d\",\"name\":\"李豫川\",\"passporttype\":\"K\"},"  
  
                +"{\"passportid\":\"K9051\",\"name\":\"李平\",\"passporttype\":\"K\",\"age\":\"23\"},"  
  
                +"{\"passportid\":\"K90517\",\"name\":\"袁寒梅\",\"passporttype\":\"K\"},"  
  
                +"{\"passportid\":\"K905199\",\"name\":\"賀明\",\"passporttype1\":\"K\"}]}";  
  
                JSONObject jsonobject = JSON.parseObject(str);//此處是com.alibaba.fastjson  
                //若是net.sf.json,則用JSONObjectjsonobject = JSONObject.fromObject(str);  
  
                try {  
  
                //獲取一個json陣列  
  
                JSONArray array = jsonobject.getJSONArray("passports");  
  
                //將json陣列 轉換成List<PassPortForLendsEntity>泛型  
  
                List<PassPortForLendsEntity> list = new ArrayList<PassPortForLendsEntity>();  
  
                for (int i =0; i < array.size(); i++){  
  
                JSONObject object =(JSONObject)array.get(i);  
  
                PassPortForLendsEntity passport =(PassPortForLendsEntity)JSONObject.toJavaObject(object,  
                PassPortForLendsEntity.class);//此處是com.alibaba.fastjson  
                //若是net.sf.json 則用(PassportLendsEntity)JSONObject.toBean(jsonobject, PassportLendsEntity.class);  
  
                if(passport != null){  
  
                list.add(passport);  
  
                }  
  
                }  
                System.out.println(list);  
    }catch(Exception e){  
        e.printStackTrace();  
    }  
}  
}  

注意:json字串str中要轉為實體類的是passports的值,裡面有三個屬性值:passportid,name,passporttype.

與之對應的實體類PassPortForLendsEntity至少有這三個屬性(屬性可以多於這三個)。

開始劃重點了!

1.實體類PassPortForLendsEntity至少包含被轉為實體類的字串passports的所有屬性,可以有多於passports中的屬性,多的屬性在轉的時候為null;

2.當passports中有實體類PassPortForLendsEntity沒有的屬性,在轉實體類的時候會被忽略,不會報錯,能轉成功;

3.passports與PassPortForLendsEntity屬性對應法則(嚴格大小寫):在PassPortForLendsEntity中能找到

passports屬性首字母大寫的get和set方法並且屬性名中的其他字母大小寫嚴格一致,而不是passports與PassPortForLendsEntity屬性名必須相同!(這點很重要)實際上只要滿足PassPortForLendsEntity中有passports屬性名首字母大寫的get和set方法並且屬性名中的其他字母大小寫嚴格一致,即使二者之間屬性名差異很大也能對應上。如PassPortForLendsEntity中的屬性xx對應passports中的屬性passporttype。

如:getPassporttype()和setPassporttype()只能使passports中是passporttype屬性對應上PassPortForLendsEntity對應的屬性,但是getPassportType()和setPassportType()就不行(但是這個可使passports中是passportType屬性對應上PassPortForLendsEntity對應的屬性)。

4.PassPortForLendsEntity中允許在get和set方法中多次對同一屬性名,但是實際能獲得值的依然是能匹配上對應關係的屬性值,並且不會被覆蓋。

如:PassPortForLendsEntity中setPassporttype1()和setXx()都對xx屬性設值,但是由於只有setPassporttype1()能匹配上passports中最後一條資料才能設值,即使此時setXx()會使xx屬性值為null,最終起作用的還是setPassporttype1()。

重點:json字串轉java實體類只看java實體類中有沒有對應的set和get方法,而不是看有沒有對應(相同)的屬性名。對應上了就能向實體類對映成功。

更多參考:https://wenku.baidu.com/view/5e6e43e102020740bf1e9b29.html


此方法雖方便,自動化程度高,但也有個弊端就是:這個介面推來的json資料的格式和實體類的get和set要約定好一一對應。但在需求經常變更的情況下,反覆修改實體類以求對應上(這也會附帶影響到其他的業務邏輯),也是夠累的。因為二者之間耦合性太高了。有沒有一種方法鬆耦合,使相互直接影響不那麼強。方法二來了。


二、鬆耦合,逐個屬性設值

不管推到介面的json要轉實體類的屬性名怎麼變化,由我來決定往java實體類的哪個屬性裡放。也就是,即使你變,也不影響我的正常使用,我也不影響你。

package test;  
  
import java.util.ArrayList;  
import java.util.List;  
  
import com.alibaba.fastjson.JSON;  
import com.alibaba.fastjson.JSONArray;  
import com.alibaba.fastjson.JSONObject;  
  
public class json2entity2 {  
    public static void main(String[] args) {  
        String str = "{\"lendperson\":\"李四\",\"lendcompany\":\"有限公司\",\"checkperson\":\"李四\","  
                + "\"lenddate\":\"2010-07-19T00:00:00\",\"lendcounts\":4,\""  
  
                + "passports\":[{\"passportid\":\"d\",\"name\":\"李豫川\",\"passporttype\":\"K\"},"  
  
                + "{\"passportid\":\"K9051\",\"name\":\"李平\",\"passporttype\":\"K\",\"age\":\"23\"},"  
  
                + "{\"passportid\":\"K90517\",\"name\":\"袁寒梅\",\"passporttype\":\"K\"},"  
  
                + "{\"passportid\":\"K905199\",\"name\":\"賀明\",\"passporttype1\":\"K\"}]}";  
  
        JSONObject jsonobject = JSON.parseObject(str);// 此處是com.alibaba.fastjson  
        // 若是net.sf.json,則用JSONObjectjsonobject = JSONObject.fromObject(str);  
  
        try {  
  
            // 獲取一個json陣列  
  
            JSONArray array = jsonobject.getJSONArray("passports");  
  
            // 將json陣列 轉換成List<PassPortForLendsEntity>泛型  
  
            List<PassPortForLendsEntity> list = new ArrayList<PassPortForLendsEntity>();  
  
            for (int i = 0; i < array.size(); i++) {  
  
                JSONObject object = (JSONObject) array.get(i);  
                PassPortForLendsEntity passport = new PassPortForLendsEntity();  
                passport.setPassportid(object.getString("passportid"));  
                passport.setName(object.getString("name"));  
                passport.setPassporttype1(object.getString("passporttype1"));  
                 if(passport != null){  
                 list.add(passport);  
                 }  
  
            }  
            System.out.println(list);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

方法二比較小心翼翼,逐個設值,你可以有機會選擇往哪個屬性裡設值,不像方法一一下全自動設值了。但也相對於方法一更麻煩,當屬性多的時候這個弊端就凸顯了。

綜述:選擇哪個方法,根據你實際需求來定。

如果你的開發文件已經定型,json格式只會小改,推薦方法一;

如果開發文件還在成型中,預測到會有不小的改動,為避免浪費時間影響開發進度,建議方法二,如果實體類屬性值較多的話,你就要權衡是用方法一還是方法二;

如果屬性不多,又要鬆耦合的話可以考慮方法二。