一,问题描述
在项目开发中,有一个需求是把一个功能中的入库操作打包成json串,发送到另外一台服务器上解析处理,数据库的操作是用的mybatis,发过来的json串是一个嵌套字符串,也就是一个类中有另一个类,一起打包成json的格式,例如:{"id":1,"value":{"id":234}},它对应的对象是:
package com.test; public class TestBuilder { private long id; private Object value; public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public long getId() { return id; } public void setId(long id) { this.id = id; } } package com.test; public class ObjBean { private long id; public long getId() { return id; } public void setId(long id) { this.id = id; } } package com.test; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; public class TestMain { public static void main(String[] args) { ObjBean objBean = new ObjBean(); objBean.setId(234L); TestBuilder testBuilder = new TestBuilder.Builder().id(1).value(objBean).build(); String str = JSON.toJSONString(testBuilder); System.out.println(str); } }但是在返解析的时候,fastjson只会先解析最外面的一层到最外面的类上面,给最外面的类赋值。而内部的类会转化为一个map,而在map中,类objBean的值会变成int类型,这样在mybatis中就无法做到类型转换到报错。
二,解决问题
1,在打包成json的时候,使用fastjson的一个特性:
ObjBean objBean = new ObjBean(); objBean.setId(234L); TestBuilder testBuilder = new TestBuilder.Builder().id(1).value(objBean).build(); String str = JSON.toJSONString(testBuilder,SerializerFeature.WriteClassName); System.out.println(str);输出:{"@type":"com.test.TestBuilder","id":1,"value":{"@type":"com.test.ObjBean","id":234}}
2,解析成类的时候
String str = "{\"@type\":\"com.test.TestBuilder\",\"id\":1,\"value\":{\"@type\":\"com.test.ObjBean\",\"id\":234}}"; TestBuilder test = JSON.toJavaObject(JSON.parseObject(str), TestBuilder.class); System.out.println(test.getId());这个时候断点,就会发现test里面包含一个map,这个map中的值类型和objbean类定义中的类的类型是一致的。
如果转载,请注明来自游戏技术网:可以加QQ群交流学习:Java技术交流群: 66728073 | C++技术交流群:197321069 | Cocos2dx交流群:317329853 | Unity3D交流群:286114103