使用FastJson实现bean与json互转,蛇形与驼峰互转
要使用FastJson,先导入jar包或引用依赖
springboot项目引用依赖(version可以是其他版本):
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
如果是传统项目,下载fastjson的jar包,导入项目中。
实现bean与json的互转
注:其实fastjson中,bean是先转成str,再将str转成json。
注:具体的bean属性及赋值可见文章最后。各个bean属性见下描述:
XwRequest:priate T head,private T body;
HeadModel:retCode,retMsg,status;
UserInfo:name,phoneNo,jobName,toyList;
Toy:toyName,toyPrice;
1.将bean转为String
// bean to String (String 是json格式)
public String bean2Str(XwRequest xwRequest){
return JSON.toJSONString(xwRequest);
}
//结果:
//{"body":{"jobName":"程序员","name":"long_tao","phoneNo":"15199999999","toyList":[{"toyName":"小汽车","toyPrice":"15.00"},{"toyName":"变形金刚","toyPrice":"35.50"}]},"head":{"retCode":"000000","retMsg":"交易成功","status":"success"}}
这里返回的是String,如果需要return json,可以再做一次转换:
public JSON str2Json(String str) {
return JSON.parseObject(str);
}
2.将驼峰形式的bean转化为蛇形json
public String bean2SXStr(XwRequest xwRequest) {
// SerializeConfig config = SerializeConfigSingleton.getInstance();
SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
return JSON.toJSONString(xwRequest, config);
}
//结果:
//{"body":{"job_name":"程序员","name":"long_tao","phone_no":"15199999999","toy_list":[{"toy_name":"小汽车","toy_price":"15.00"},{"toy_name":"变形金刚","toy_price":"35.50"}]},"head":{"ret_code":"000000","ret_msg":"交易成功","status":"success"}}
里面的SerializeConfigSingleton是自己写的单例,开发中建议使用单例避免性能问题
public class SerializeConfigSingleton {
private volatile static SerializeConfig singleton;
private SerializeConfigSingleton() {
}
public static SerializeConfig getInstance() {
if (singleton == null) {
synchronized (SerializeConfig.class) {
if (singleton == null) {
singleton = new SerializeConfig();
}
}
}
return singleton;
}
}
3.将驼峰形式的bean转化为蛇形map
public Map<String, Object> bean2Map(XwRequest xwRequest) {
//使用单例模式,避免性能问题
SerializeConfig config = SerializeConfigSingleton.getInstance();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
String str = JSON.toJSONString(xwRequest, config);
return JSON.parseObject(str, Map.class);
//结果:
//{"head":{"ret_msg":"交易成功","ret_code":"000000","status":"success"},"body":{"phone_no":"15199999999","job_name":"程序员","name":"long_tao","toy_list":[{"toy_name":"小汽车","toy_price":"15.00"},{"toy_name":"变形金刚","toy_price":"35.50"}]}}
}
json.parseObject(String,Clazz);–将字符串转为bean
4.将json转为简单bean- -自动实现蛇形转驼峰
// json的key是蛇形时,bean的属性是驼峰时,会自动转成驼峰
public XwRequest json2Bean(JSON json) {
return JSON.toJavaObject(json, XwRequest.class);
}
5.将json转为嵌套对象中某个具体的bean- -自动实现蛇形转驼峰
public UserInfo json2BeanUser(JSON json) {
//此处获取到的json是复杂bean的json
XwRequest xwRequest = JSON.toJavaObject(json, XwRequest.class);
return JSON.toJavaObject(JSON.parseObject(xwRequest.getBody().toString()), UserInfo.class);
//结果:
//{"name":"long_tao","phoneNo":"15199999999","jobName":null,"toyList":[{"toyName":"小汽车","toyPrice":"15.00"},{"toyName":"变形金刚","toyPrice":"35.50"}]}
}
在转化的时候,出现了意外:
1.不能直接使用下列强转
//不能实现JsonObject 转 javaBean
UserInfo u1 = (UserInfo) xwRequest.getBody();
//会报错:
//Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to FastJson.model.UserInfo
2.json转为泛型bean时,再将bean输出,此时泛型对象内的属性还是蛇形
public class XwRequest<T> {
private T head;
private T body;
}
//结果:
//{"head":{"ret_msg":"交易成功","ret_code":"000000","status":"success"},"body":{"phone_no":"15199999999","job_mame":"程序员","name":"long_tao","toy_list":[{"toy_name":"小汽车","toy_price":"15.00"},{"toy_name":"变形金刚","toy_price":"35.50"}]}}
附录
给XwRequest 赋值:
public static XwRequest setRequest() {
XwRequest requset = new XwRequest();
HeadModel headModel = new HeadModel();
headModel.setRetCode("000000");
headModel.setRetMsg("交易成功");
headModel.setStatus("success");
requset.setHead(headModel);
UserInfo userModel = new UserInfo();
userModel.setName("long_tao");
userModel.setPhoneNo("15199999999");
userModel.setJobName("程序员");
List<Toy> toyList = new LinkedList<Toy>();
Toy toy1 = new Toy();
toy1.setToyName("小汽车");
toy1.setToyPrice("15.00");
toyList.add(toy1);
Toy toy2 = new Toy();
toy2.setToyName("变形金刚");
toy2.setToyPrice("35.50");
toyList.add(toy2);
userModel.setToyList(toyList);
requset.setBody(userModel);
return requset;
}
写在最后:
才疏学浅,若有错误的地方,欢迎大家指正。