FastJson实现bean与json互转,蛇形与驼峰互转

使用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;
   }

写在最后:
才疏学浅,若有错误的地方,欢迎大家指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值