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;
}
|
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;
}
|
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 public HttpMessageConverter fastJsonHttpMessageConverters() { 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()); } }
|