本指南探讨了如何在Spring Boot应用程序中使用ObjectMapper
将Java对象转换为JSON,以及将JSON转换回Java对象。它涵盖了关键用例,例如自定义JSON字段名称、处理未知属性、处理列表,以及为特殊场景(如日期格式和美化打印)配置ObjectMapper
。
ObjectMapper
是Spring Boot中的一个关键组件,用于将Java对象序列化为JSON,并将JSON反序列化为Java对象。以下是一些常见的ObjectMapper
用例及代码示例:
1. 基本对象到JSON的转换
此用例涉及将Java对象转换为JSON。
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectToJsonExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Employee employee = new Employee(1, "John", "Developer");
// Convert Object to JSON
String jsonString = objectMapper.writeValueAsString(employee);
System.out.println(jsonString);
}
}
2. 基本JSON到对象的转换
此用例演示了将JSON字符串反序列化为Java对象。
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonToObjectExample {
public static void main(String[] args) throws Exception {
String jsonString = "{\"id\":1,\"name\":\"John\",\"designation\":\"Developer\"}";
ObjectMapper objectMapper = new ObjectMapper();
// Convert JSON string to Java object
Employee employee = objectMapper.readValue(jsonString, Employee.class);
System.out.println(employee.getName()); // Output: John
}
}
3. 使用注解自定义JSON字段名称
在某些情况下,Java对象中的字段名称可能与JSON中的字段名称不匹配。使用@JsonProperty
来处理此问题。
import com.fasterxml.jackson.annotation.JsonProperty;
public class Employee {
private int id;
@JsonProperty("full_name")
private String name;
private String designation;
// constructor, getters, setters
}
JSON:
{
"id": 1,
"full_name": "John",
"designation": "Developer"
}
4. 序列化时忽略字段
在将对象转换为JSON时,可能需要忽略某些字段。使用@JsonIgnore
来跳过这些字段。
import com.fasterxml.jackson.annotation.JsonIgnore;
public class Employee {
private int id;
private String name;
@JsonIgnore
private String password; // This will be ignored during serialization
// constructor, getters, setters
}
5. 处理未知的JSON字段
在反序列化时,JSON中可能存在Java对象中不存在的字段。使用@JsonIgnoreProperties(ignoreUnknown = true)
来避免因未知字段而导致的错误。
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Employee {
private int id;
private String name;
private String designation;
// constructor, getters, setters
}
6. 将对象列表转换为JSON
您可以使用ObjectMapper
轻松地序列化和反序列化对象列表。
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class ListToJsonExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
List<Employee> employees = Arrays.asList(
new Employee(1, "John", "Developer"),
new Employee(2, "Jane", "Tester")
);
// Convert List to JSON
String jsonString = objectMapper.writeValueAsString(employees);
System.out.println(jsonString);
// Convert JSON back to List
List<Employee> employeeList = objectMapper.readValue(jsonString, new TypeReference<List<Employee>>() {});
System.out.println(employeeList.get(0).getName()); // Output: John
}
}
7. 在Spring Boot控制器中使用ObjectMapper
在Spring Boot中,ObjectMapper
可以用于REST API中处理JSON输入和输出。
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private ObjectMapper objectMapper;
@PostMapping("/create")
public String createEmployee(@RequestBody String employeeJson) throws Exception {
Employee employee = objectMapper.readValue(employeeJson, Employee.class);
return "Employee created: " + employee.getName();
}
@GetMapping("/get")
public String getEmployee() throws Exception {
Employee employee = new Employee(1, "John", "Developer");
return objectMapper.writeValueAsString(employee);
}
}
8. 将JSON文件转换为对象
您可以直接将JSON文件反序列化为Java对象。
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
public class JsonFileToObjectExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Read JSON from file and convert to Employee object
Employee employee = objectMapper.readValue(new File("employee.json"), Employee.class);
System.out.println(employee.getName());
}
}
9. 美化打印JSON输出
使用writerWithDefaultPrettyPrinter()
来美化打印JSON输出,以提高可读性。
public class PrettyPrintJsonExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Employee employee = new Employee(1, "John", "Developer");
// Convert Object to Pretty JSON
String prettyJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(employee);
System.out.println(prettyJson);
}
}
10. 自定义ObjectMapper
配置
您可以根据特定需求配置ObjectMapper
,例如处理空值、日期格式等。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
public class CustomObjectMapperExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Register Java 8 Time module to handle date/time
objectMapper.registerModule(new JavaTimeModule());
// Disable timestamp formatting for dates
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// Convert Employee with LocalDate field
Employee employee = new Employee(1, "John", LocalDate.now());
String jsonString = objectMapper.writeValueAsString(employee);
System.out.println(jsonString);
}
}
没有回复内容