json字符串转java实体类及属性对应中的猫腻详解⼀、json强转实体类
1.实体类
package test;
public class PassPortForLendsEntity {
private String passportid;
private String name;
private String xx;
fastjson忽略属性
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) {
< = passporttype;
}
public String getXx() {
return xx;
}
public void setXx(String 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 = JSONArray("passports");
//将json数组转换成List<PassPortForLendsEntity>泛型
List<PassPortForLendsEntity> list = new ArrayList<PassPortForLendsEntity>();
for (int i =0; i < array.size(); i++){
JSONObject object =((i);
PassPortForLendsEntity passport =(JavaObject(object,
PassPortForLendsEntity.class);//此处是com.alibaba.fastjson
//若是net.sf.json 则⽤(Bean(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⽅法,⽽不是看有没有对应(相同)的属性名。对应上了就能向实体类映射成功。
更多参考:wenku.baidu/view/5e6e43e102020740bf1e9b29.html
此⽅法虽⽅便,⾃动化程度⾼,但也有个弊端就是:这个接⼝推来的json数据的格式和实体类的get和se
t要约定好⼀⼀对应。但在需求经常变更的情况下,反复修改实体类以求对应上(这也会附带影响到其他的业务逻辑),也是够累的。因为⼆者之间耦合性太⾼了。有没有⼀种⽅法松耦合,使相互直接影响不那么强。⽅法⼆来了。
⼆、松耦合,逐个属性设值
不管推到接⼝的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 = JSONArray("passports");
// 将json数组转换成List<PassPortForLendsEntity>泛型
List<PassPortForLendsEntity> list = new ArrayList<PassPortForLendsEntity>();
for (int i = 0; i < array.size(); i++) {
JSONObject object = (JSONObject) (i);
PassPortForLendsEntity passport = new PassPortForLendsEntity();
passport.String("passportid"));
passport.String("name"));
passport.String("passporttype1"));
if(passport != null){
list.add(passport);
}
}
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
}
}
⽅法⼆⽐较⼩⼼翼翼,逐个设值,你可以有机会选择往哪个属性⾥设值,不像⽅法⼀⼀下全⾃动设值了。但也相对于⽅法⼀更⿇烦,当属性多的时候这个弊端就凸显了。
综述:选择哪个⽅法,根据你实际需求来定。
如果你的开发⽂档已经定型,json格式只会⼩改,推荐⽅法⼀;
如果开发⽂档还在成型中,预测到会有不⼩的改动,为避免浪费时间影响开发进度,建议⽅法⼆,如果实体类属性值较多的话,你就要权衡是⽤⽅法⼀还是⽅法⼆;
如果属性不多,⼜要松耦合的话可以考虑⽅法⼆。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。