工作中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);
}
转换前:
转换后: