json转换

json转换

jackson

依赖

1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>

使用:JSON转Java

操作基于ObjectMapper对象的**readValue()**来完成

转换规则:将JSON对象的字段映射到Java对象中的属性。 Jackson删除了getter和setter方法名称的“ get”和“ set”部分,并将其余名称的第一个字符转换为小写。

需要实现get、set方法

1
2
3
4
5
6
public class Car {
private String brand = null;
private int doors = 0;

/** Getter and Setter */
}
JSON –> Java对象

readValue()重载方法可以传入:

字符串(String)、字符输入流(Reader)、字节输入流(InputStream)、

文件(File)、URL、二进制(byte[])等

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

ObjectMapper objectMapper = new ObjectMapper();
try {
Car car = objectMapper.readValue(carJson, Car.class);

System.out.println(car);
} catch (IOException e) {
e.printStackTrace();
}
}
JSON数组字符串 –> Java对象数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";

ObjectMapper objectMapper = new ObjectMapper();
try {
Car[] cars = objectMapper.readValue(jsonArray, Car[].class);

for (Car car : cars) {
System.out.println(car);
}
} catch (IOException e) {
e.printStackTrace();
}
}
JSON数组字符串 –> List
1
List<Car> cars = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>() {});
JSON –> Map

JSON对象中的每个字段都将成为Java Map中的键

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";

ObjectMapper objectMapper = new ObjectMapper();
try {
Map<String, Object> cars = objectMapper.readValue(jsonObject, new TypeReference<Map<String, Object>>() {});

System.out.println(cars.keySet());
} catch (IOException e) {
e.printStackTrace();
}
}
忽略不匹配的字段
1
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
不允许基本类型为null

默认会赋空值,设置了这个则会报错

1
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);

使用:Java转JSON

操作基于ObjectMapper对象的**writeValue()/writeValueAsString()/writeValueAsBytes()**来完成

Java对象 –> JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();
car.setBrand("BMW");
car.setDoors(4);

try {
String json = objectMapper.writeValueAsString(car);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
将Date类型转为String

默认是转为毫秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
// 设置日期转换器
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
objectMapper.setDateFormat(simpleDateFormat);

Car car = new Car();
car.setBrand("BMW");
car.setDoors(4);
car.setData(new Date());

try {
String json = objectMapper.writeValueAsString(car);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}

注解

注解 用法
@JsonProperty 用于属性,把属性的名称序列化时转换为另外一个名称。示例:
@JsonProperty(“birth_ date”)
private Date birthDate;
@JsonFormat 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例:
@JsonFormat(timezone =”GMT+8”, pattern = “yyyy-MM-dd HH:mm”)
public Date getBirthDate()
@JsonPropertyOrder 用于类, 指定属性在序列化时 json 中的顺序 , 示例:
@JsonPropertyOrder({ “birth_Date”, “name” })
public class Person
@JsonCreator 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。
示例:@JsonCreator
public Person(@JsonProperty(“name”)String name) {…}
@JsonAnySetter 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中
@JsonAnySetter
public void set(String key, Object value) {
map.put(key, value);
}
@JsonAnyGetter 用于方法 ,获取所有未序列化的属性
public Map<String, Object> any() { return map; }

Gson

依赖

1
2
3
4
5
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>

创建Gson

1
2
3
4
5
6
// 直接创建
Gson gson = new Gson();

// 通过工厂类创建
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();

使用:JSON转Java

操作基于Gson对象来的**fromJson()**完成

需要实现get、set方法

1
2
3
4
5
6
7
8
public class Employee {
private int id;
private String firstName;
private String lastName;
private String email;

// Getter and Setter
}
JSON –> Java对象

类似jackson的readValue()方法

1
2
3
4
5
6
7
public static void main(String[] args) {
String jsonString = "{'id':1001, 'firstName':'Lokesh', 'lastName':'Gupta', 'email':'howtodoinjava@gmail.com'}";
Gson gson = new Gson();

Employee empObject = gson.fromJson(jsonString, Employee.class);
System.out.println(empObject);
}
JSON数组字符串 –> Java对象数组
1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
String json = "[{'id':1001, 'firstName':'Lokesh', 'lastName':'Gupta', 'email':'howtodoinjava@gmail.com'}," +
"{'id':1001, 'firstName':'Lokesh', 'lastName':'Gupta', 'email':'howtodoinjava@gmail.com'}]";
Gson gson = new Gson();

Employee[] employees = gson.fromJson(json, Employee[].class);
for (Employee employee : employees) {
System.out.println(employee);
}
}
JSON数组字符串 –> List
1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
String json = "[{'id':1001, 'firstName':'Lokesh', 'lastName':'Gupta', 'email':'howtodoinjava@gmail.com'}," +
"{'id':1001, 'firstName':'Lokesh', 'lastName':'Gupta', 'email':'howtodoinjava@gmail.com'}]";
Gson gson = new Gson();

ArrayList<Employee> employees = gson.fromJson(json, new TypeToken<ArrayList<Employee>>() {
}.getType());

for (Employee employee : employees) {
System.out.println(employee);
}
}
JSON数组字符串 –> Set
1
2
Set<Employee> employees = gson.fromJson(json, new TypeToken<HashSet<Employee>>() {
}.getType());

使用:Java转Json

操作基于Gson对象的**toJson()**来完成

重载支持set

Java对象 –> JSON
1
2
3
4
5
6
7
public static void main(String[] args) {
Employee emp = new Employee(1001, "Lokesh", "Gupta", "howtodoinjava@gmail.com");
Gson gson = new Gson();

String jsonString = gson.toJson(emp);
System.out.println(jsonString);
}
格式化输出

通过工厂类创建Gson,设置setPrettyPrinting

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
Employee employeeObj = new Employee(1, "Lokesh", "Gupta", "howtogoinjava@gmail.com");
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();

String json = gson.toJson(employeeObj);
System.out.println(json);
}
1
2
3
4
5
6
7
// 打印
{
"id": 1,
"firstName": "Lokesh",
"lastName": "Gupta",
"email": "howtogoinjava@gmail.com"
}

注解

注解 用法
@SerializedName 自定义字段的名字
@Expose 只要有一个字段使用了Expose注解,所有需要参与序列化和反序列化的字段都要有这个注解
@Expose(deserialize = false)声明不参与反序列化
@Expose(serialize = false)声明该字段不参与序列化

fastJson

依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

@Configuration
public class WebConfig implements WebMvcConfigurer {
//使用@Bean注入fastJsonHttpMessageConvert
@Bean
public HttpMessageConverter fastJsonHttpMessageConverters() {
//1.需要定义一个Convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");

SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);

fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return converter;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(fastJsonHttpMessageConverters());
}
}

json转换
http://xwww12.github.io/2022/11/29/其他/json转换/
作者
xw
发布于
2022年11月29日
许可协议