Fastjson的使用以及实际需求的解决方案

        工作中JSON转换非常常见,本文将对转换方法和实际开发处理两方面说明。

一、常用的java到json对象转换方法如下:

1、Java对象–>JSON对象:

(JSONObject)JSONObject.toJSON(Java对象实例)

public class JSON2JavaTest{
  public static void main(String[] args) {
     Student stu = new Student("公众号", "m", 2);

     //Java对象转化为JSON对象
     JSONObject jsonObject = (JSONObject) JSONObject.toJSON(stu);
     System.out.println("Java对象转化为JSON对象\n" + jsonObject);//{"name":"编程","age":2,"sex":"m"}
  }
}
2、Java对象–>JSON字符串

JSONObject.toJSONString(Java对象实例)

public class JSON2JavaTest{
    public static void main(String[] args) {
        Student stu = new Student("公众y", "m", 2);

        //Java对象转换成JSON字符串
        String stuString = JSONObject.toJSONString(stu);
        System.out.println("Java对象转换成JSON字符串\n" + stuString);//{"age":2,"name":"大道","sex":"m"}
    }
}
3、JSON对象–>JSON字符串

JSONObject.toJSONString();

public class JSON2JavaTest{
 public static void main(String[] args) {
     Student stu = new Student("公众oy", "m", 2);

     //先转成JSON对象
     JSONObject jsonObject = (JSONObject) JSONObject.toJSON(stu);

     //JSON对象转换为JSON字符串
     String jsonString = jsonObject.toJSONString();
     System.out.println("JSON对象转换为JSON字符串\n" + jsonString);//{"name":"公大道","age":2,"sex":"m"
 }
}
4、JSON对象–>Java对象

JSONObject.toJavaObject(JSON对象实例, Java对象.class);

public class JSON2JavaTest{
    public static void main(String[] args) {
        Student stu = new Student("公erBoy", "m", 2);

        //先转成JSON对象
        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(stu);
        
        //JSON对象转换成Java对象
        Student student = JSONObject.toJavaObject(jsonObject, Student.class);
        System.out.println("JSON对象转换成Java对象\n" + student);//Student{name='公众道', sex='m', age=2}
    }
}
5、JSON字符串–>JSON对象

JSONObject.parseObject(JSON字符串)

public class JSON2JavaTest{
 public static void main(String[] args) {
     String stuString = "{\"age\":2,\"name\":\"公众 Big\",\"sex\":\"m\"}";

     //JSON字符串转换成JSON对象
     JSONObject jsonObject1 = JSONObject.parseObject(stuString);
     System.out.println("JSON字符串转换成JSON对象\n" + jsonObject1);//{"sex":"m","name":"公众道","age":
 }
}
6、JSON字符串–>Java对象

JSONObject.parseObject(JSON字符串, Java对象.class);

public class JSON2JavaTest{
    public static void main(String[] args) {
        String stuString = "{\"age\":2,\"name\":\"公号 By\",\"sex\":\"m\"}";

        //JSON字符串转换成Java对象
        Student student1 = JSONObject.parseObject(stuString, Student.class);
        System.out.println("JSON字符串转换成Java对象\n" + student1);//Student{name='公程大道', sex='m', age=2
    }
}
7、JSON字符串–>List<Java对象>

List parseArray(JSON字符串, Java对象.class)

public class JSON2JavaTest{
    public static void main(String[] args) {
        String stuString = "[{\"age\":2,\"name\":\"公号\",\"sex\":\"m\"},{\"age\":18,\"name\":\"BirBoy\",\"sex\":\"m\"}]";

        //JSON字符串转换成Java对象
        List<Student> studentList = JSONObject.parseArray(stuString, Student.class);
        System.out.println("JSON字符串转换成Java对象list\n" +studentList );
   }
 }

二、实际开发需求处理案例:

1、BigDecimal类型属性json转换后自动保留小数点后一位0

比如一个num,本来是1。结果转换之后num = 1.0。解决方式,在对象的set方法中做如下处理:

public BigDecimal getNum() {
        return num;
    }

public void setNum(BigDecimal num) {
   this.num = num == null? null : new BigDecimal(num.stripTrailingZeros().toPlainString());
}
2、Date格式属性json转换时时区问题

Date类型的字段,经过如下json转换之后。发现所有时间都往前修改了8小时,这是由于时区引发的问题。

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(result);

解决方式1,在yml配置中或者xml配置中设置:

spring:
  jackson:
    # 格式化全局时间字段 年-月-天 时:分:秒
    date-format: yyyy-MM-dd HH:mm:ss
    # 指定时间区域类型 东8区时区 既北京时间
    time-zone: GMT+8

解决方式2,在实体类中加注解:

@JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
private Date startDate;
3、去除null值的属性

mysql中查询结束,有些字段是null。在jsno转换中,不希望带上这些字段,可以使用如下做法。

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String json = mapper.writeValueAsString(result); // result存放了对象集合

这样result得到的结果就是去除了所有null值字段的!

4、id超长问题

比如后端数据库中id=1872621619555926016,mysql数据库中用bigint存放,后端用Long包装类,传到前端时由于Javascript最大安全数导致的限制。导致1872621619555926016变为1872621619555926000,而出现id不一致的问题。此时需要把后端Long类型转化为String类型来解决问题。

通过如下注解修改json转化时的类型,而不用去修改id类型,可快速解决问题。

@JsonSerialize(using = ToStringSerializer.class)
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
    

/** id */
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
4、ObjectMapper将JSON格式的Object对象,转换为实际Bean
List<SupplierConDateMain> conMainList = new ArrayList<>();
        ObjectMapper objectMapper = new ObjectMapper();
        for (Object p : map) {
            SupplierConDateMain main = objectMapper
.convertValue(p, SupplierConDateMain.class);
            conMainList.add(main);
        }

转换前:

转换后:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值