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中能找到
如: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格式只會小改,推薦方法一;
如果開發文件還在成型中,預測到會有不小的改動,為避免浪費時間影響開發進度,建議方法二,如果實體類屬性值較多的話,你就要權衡是用方法一還是方法二;
如果屬性不多,又要鬆耦合的話可以考慮方法二。