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格式只会小改,推荐方法一;

如果开发文档还在成型中,预测到会有不小的改动,为避免浪费时间影响开发进度,建议方法二,如果实体类属性值较多的话,你就要权衡是用方法一还是方法二;

如果属性不多,又要松耦合的话可以考虑方法二。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值