当前位置: 首页 > 工具软件 > Fast-cast > 使用案例 >

Fast-Json 详解 — JSONObject与实体之间的转换。

何高旻
2023-12-01

一个完美的JSON框架不仅仅可以创建JSON对象,还应该可以将JSON对象与实体之间互相转换,而fast-json就是如此一个框架,前面我们已经知道JSONObject 的getObject方法可以将从JSONObject获取到的一个值转换为实体。除此之外com.alibaba.fastjson.JSON有很多静态方法用于实体与JSON对象之间的转换。其中主要有:

  • toJavaObject 将JSON对象转换为实体对象
  • parse 将JSON 字符串转化为JSONObject或者实体对象
  • parseArray 将字符串转换为 JSONArray或者List类型
  • parseObject 将JSON字符串转化为JSONObject或者实体对象
  • toJSON 将对象抓换为JSON对象
  • toJSONBytes 将对象转换为序列化JSON数据
  • toJSONString 将对象转换为JSON字符串

下面我们使用几个例子展示使用fast-json将实体与JSONObject进行转换。在转换时我们需要考虑一下几个方面:

1.JSONObject转换为实体时,JSONObject的key在实体不存在时怎么解决的。

public static void feildsLtKey() {
	JSONObject json =  new JSONObject();
	json.put("city", "hangzhou");
	json.put("id", "1");
	json.put("user", "user");
	User user1 = JSON.toJavaObject(json, User.class);
	User user2 = JSON.parseObject(json.toJSONString(),User.class);
	System.out.println(user1.toString());
	System.out.println(user2.toString());
	User user3 = json.getObject("user", User.class);
	System.out.println(user3);
}
运行结果:
User [id=1, username=null, isLogin=false, money=0.0, roles=null, psPassword=null]
User [id=1, username=null, isLogin=false, money=0.0, roles=null, psPassword=null]
Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:505)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:1555)
	at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_1_User.deserialze(Unknown Source)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:284)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:687)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:383)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:287)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:560)
	at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:1069)
	at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:891)
	at com.alibaba.fastjson.JSONObject.getObject(JSONObject.java:153)
	at cn.org.microservice.fastjson.json2object.JSONObject2Entity.feildsLtKey(JSONObject2Entity.java:36)
	at cn.org.microservice.fastjson.json2object.JSONObject2Entity.main(JSONObject2Entity.java:52)
总结:
1.使用JSON中的方法转换时如果JSON中的key不在实体中的字段,则会忽略该key
2.使用JSONObject中的getObject方法时,如果获取的字段类型不一致,则抛出异常

2.JSONObject转换为实体时,实体的字段在不在JSONObject的的key中怎么解决

public static void feildsGtKey() {
	JSONObject json =  new JSONObject();
	User user1 = JSON.toJavaObject(json, User.class);
	User user2 = json.getObject("user", User.class);
	System.out.println(user1.toString());
	System.out.println(user2.toString());
}
运行结果:
User [id=0, username=null, isLogin=false, money=0.0, roles=null, psPassword=null]
User [id=0, username=null, isLogin=false, money=0.0, roles=null, psPassword=null]
Exception in thread "main" java.lang.NullPointerException
	at cn.org.microservice.fastjson.json2object.JSONObject2Entity.feildsGtKey(JSONObject2Entity.java:38)
	at cn.org.microservice.fastjson.json2object.JSONObject2Entity.main(JSONObject2Entity.java:42)
总结:
1.可以看出使用JSON转换时,不存在实体中的字段时,实体会给实体中的字段赋默认值
2.使用JSONObjct转换时,如果字段不存在则抛出null指针异常

3.多层级的实体,即一个实体可能包含另外的实体或者集合Collection是怎么转换为JSONObject对象的。

public static void main(String[] args) {
	User user = new User();
	user.setId(1);
	user.setUsername("pharos");
	user.setLogin(true);
	user.setMoney(300.0F);
	List<String> roles = new ArrayList<String>();
	roles.add("admin");
	roles.add("user");
	user.setRoles(roles);
	UserPassword ps = new UserPassword();
	ps.setPassword("sss");
	ps.setSalt("ss");
	Map<String, String> map = new HashMap<String, String>();
	map.put("test", "test");
	ps.setMap(map);
	user.setPsPassword(ps);
		
	JSONObject json = (JSONObject) JSON.toJSON(user);
	String json2 = JSON.toJSONString(user);
	JSONObject json3 = (JSONObject) JSON.parse(json2);
	JSONObject json4 = JSON.parseObject(json3.toJSONString(), JSONObject.class);
	System.out.println(json);
	System.out.println(json2);
	System.out.println(json3);
	System.out.println(json4);
}
运行结果:
{"money":300.0,"roles":["admin","user"],"id":1,"login":true,"psPassword":{"password":"sss","salt":"ss","map":{"test":"test"}},"username":"pharos"}
{"id":1,"login":true,"money":300.0,"psPassword":{"map":{"test":"test"},"password":"sss","salt":"ss"},"roles":["admin","user"],"username":"pharos"}
{"money":300.0,"roles":["admin","user"],"id":1,"login":true,"psPassword":{"password":"sss","salt":"ss","map":{"test":"test"}},"username":"pharos"}
{"money":300.0,"roles":["admin","user"],"id":1,"login":true,"psPassword":{"password":"sss","salt":"ss","map":{"test":"test"}},"username":"pharos"}
总结:
JSON中的方法可以将多层对象转换为Object

4.JSONObject怎么转换为多层级实体,即一个实体可能包含另外的实体或者集合Collection

public static void feildsEqKey() {
	JSONObject json =  new JSONObject();
	User user = new User();
	user.setId(1);
	user.setUsername("pharos");
	user.setLogin(true);
	user.setMoney(300.0F);
	List<String> roles = new ArrayList<String>();
	roles.add("admin");
	roles.add("user");
	user.setRoles(roles);
	UserPassword ps = new UserPassword();
	ps.setPassword("sss");
	ps.setSalt("ss");
	Map<String, String> map = new HashMap<String, String>();
	map.put("test", "test");
	ps.setMap(map);
	user.setPsPassword(ps);
	json.put("user", user);
	json.put("id", 2);
	json.put("username", "jetty");
	json.put("isLogin", false);
	json.put("money", 600.0F);
	json.put("roles", roles);
	json.put("psPassword", ps);
	User user1 = JSON.toJavaObject(json, User.class);
	User user2 = JSON.parseObject(json.toJSONString(),User.class);
	System.out.println(user1.toString());
	System.out.println(user2.toString());
	User user3 = json.getObject("user", User.class);
	System.out.println(user3);
}
运行结果:
User [id=2, username=jetty, isLogin=false, money=600.0, roles=[admin, user], psPassword=UserPassword [password=sss, salt=ss, map={test=test}]]
User [id=2, username=jetty, isLogin=false, money=600.0, roles=[admin, user], psPassword=null]
User [id=1, username=pharos, isLogin=true, money=300.0, roles=[admin, user], psPassword=UserPassword [password=sss, salt=ss, map={test=test}]]
总结:
1.JSON的toJavaObject方法和JSONObject的getObject方法支持深转换,可以转换实体内的对象
2.JSON的parseObject方法不支持深转换,只能转换一层对象

以上为fast-json对象转换之间最常用的API,上述方法都是重载方法,可以传入不通的参数,具体使用方式,可以查阅Fast-Json API

 

 类似资料: