java jackson总结

时间:2025-08-27 18:24:01来源:互联网

下面小编就为大家分享一篇java jackson总结,具有很好的参考价值,希望对大家有所帮助。

使用

在Spring Boot项目中,Jackson库默认是内置的,因此你通常不需要手动添加依赖。

创建实体类

public class User {  
    private String name;  
    private int age;  
  
    // getters and setters  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
}

在Controller中,你可以使用@ResponseBody注解将Java对象自动转换为JSON响应。

@RestController  
@RequestMapping("/api/users")  
public class UserController {  
  
    @GetMapping("/{id}")  
    public ResponseEntity<User> getUser(@PathVariable int id) {  
        // 模拟从数据库或其他地方获取用户数据  
        User user = new User();  
        user.setName("John Doe");  
        user.setAge(30);  
        return ResponseEntity.ok(user); // 这里会自动转换为JSON  
    }  
}

同样地,你也可以使用@RequestBody注解将JSON请求体自动转换为Java对象。

@PostMapping("/create")  
public ResponseEntity<User> createUser(@RequestBody User user) {  
    // 这里user对象已经是从JSON请求体中反序列化得到的  
    // 处理user对象,比如保存到数据库  
    return ResponseEntity.ok(user);  
}

自定义序列化和反序列化

public class CustomUserSerializer extends StdSerializer<User> {  
    protected CustomUserSerializer() {  
        this(null);  
    }  
  
    public CustomUserSerializer(Class<User> t) {  
        super(t);  
    }  
  
    @Override  
    public void serialize(User value, JsonGenerator gen, SerializerProvider arg2)  
            throws IOException, JsonProcessingException {  
        gen.writeStartObject();  
        gen.writeStringField("name", value.getName());  
        gen.writeNumberField("age", value.getAge());  
        gen.writeEndObject();  
    }  
}

然后在你的对象上使用@JsonSerialize注解来指定自定义序列化器。

@JsonSerialize(using = CustomUserSerializer.class)  
public class User {  
    // ...  
}

对于反序列化,你也可以类似地创建自定义的反序列化器并使用@JsonDeserialize注解。

配置jackson

你可以通过application.propertiesapplication.yml文件配置Jackson的行为,或者在Spring配置中创建一个Jackson2ObjectMapperBuilderCustomizer bean来定制ObjectMapper。

spring:  
  jackson:  
    date-format: yyyy-MM-dd HH:mm:ss  
    time-zone: Asia/Shanghai

或者在Java配置中:

@Configuration  
public class JacksonConfig {  
  
    @Bean  
    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperBuilderCustomizer() {  
        return builder -> {  
            builder.serializers(new CustomSerializerModifier());  
            builder.deserializers(new CustomDeserializerModifier());  
            // 其他配置...  
        };  
    }  
}

ObjectMapper的使用:

ObjectMapper 是核心类,用于在Java对象和JSON数据之间进行序列化和反序列化。

可以直接创建一个 ObjectMapper 的实例,然后重用它来处理多个序列化和反序列化操作。

import com.fasterxml.jackson.databind.ObjectMapper;  
  
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();  
user.setName("John Doe");  
user.setAge(30);  
  //使用 writeValueAsString 方法将Java对象转换为JSON格式的字符串。
String jsonString = objectMapper.writeValueAsString(user);  
System.out.println(jsonString); // 输出:{"name":"John Doe","age":30}
//使用 readValue 方法将JSON字符串转换为Java对象。 
  
User user = objectMapper.readValue(jsonString, User.class);  
System.out.println(user.getName()); // 输出:John Doe  
System.out.println(user.getAge());  // 输出:30
//反序列化使用TypeReference,这是一种类型安全的做法,比直接使用Class对象要有利,因为它可以捕获更多关于类型的细节,特别是在使用泛型时。
User user = objectMapper.readValue(jsonString, new TypeReference<User>() {});

ObjectMapper 也可以用来读取和写入JSON文件。

// 写入JSON文件  
objectMapper.writeValue(new File("user.json"), user);  
  
// 读取JSON文件  
User userFromFile = objectMapper.readValue(new File("user.json"), User.class);

配置 ObjectMapper:

objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 格式化输出  
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性  
objectMapper.setSerializationInclusion(Include.NON_NULL); // 只序列化非空属性

注解的使用:

Jackson提供了很多注解来简化序列化和反序列化的过程,例如:

  • @JsonProperty:用于指定JSON属性名。
  • @JsonIgnore:用于忽略某个属性的序列化和反序列化。
  • @JsonFormat:用于自定义日期、时间等类型的格式。
  • @JsonSerialize 和 @JsonDeserialize:用于指定自定义的序列化器和反序列化器。
  • @JsonIgnoreProperties 忽略指定的属性

@JsonIgnoreProperties 说明:

当你使用Jackson将Java对象转换为JSON字符串,或者将JSON字符串转换为Java对象时,这个注解可以帮助你控制哪些属性应该被包括在内,哪些属性应该被忽略。

当你将@JsonIgnoreProperties注解放在类上时,它会影响整个类的所有属性。你可以指定一个或多个要忽略的属性名。如果JSON字符串中包含了这些属性,但在Java类中没有对应的字段,那么在反序列化过程中这些属性会被忽略,不会抛出异常。同样地,如果Java类中的某些字段在JSON字符串中没有对应的属性,这些字段也不会被序列化。

@JsonIgnoreProperties({"password", "email"})  
public class User {  
    private String username;  
    private String password;  
    private String email;  
    // getters and setters  
}

在这个例子中,passwordemail属性在序列化和反序列化时都会被忽略。

也可以尝试将其用于属性级别,但这并不是它的典型用法。在属性级别上,更常用的注解是@JsonIgnore,它用于忽略单个属性的序列化和反序列化。

使用@JsonIgnoreProperties注解时,你还可以设置ignoreUnknown属性为true,这样当JSON字符串中包含Java类中不存在的属性时,Jackson不会抛出异常,而是会简单地忽略这些未知属性。

@JsonIgnoreProperties(ignoreUnknown = true)  
public class User {  
    // class fields, getters, and setters  
}

异常处理:

当序列化和反序列化过程中发生错误时,ObjectMapper 会抛出异常,通常是 JsonProcessingException 的子类。因此,你应该在调用 writeValue 和 readValue 方法时使用 try-catch 块来处理这些异常。

try {  
    String jsonString = objectMapper.writeValueAsString(user);  
    // ...  
} catch (JsonProcessingException e) {  
    e.printStackTrace();  
}

 

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!