仅作学习记录
ObjectMapper
是 Jackson 库中的一个类,用于实现 Java 对象(如 POJO、Map、List 等)与 JSON 数据之间的相互转换。通过 ObjectMapper
,可以将 Java 对象序列化为 JSON 数据,也可以将 JSON 数据反序列化为 Java 对象。
以下是 ObjectMapper
的一些常用方法:
readValue(String content, Class<T> valueType)
:将 JSON 数据解析为 Java 对象。
javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
String json = "{\"name\":\"John\", \"age\":30}";
User user = objectMapper.readValue(json, User.class);
writeValueAsString(Object value)
:将 Java 对象转换为 JSON 字符串。
javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
User user = new User("John", 30);
String json = objectMapper.writeValueAsString(user);
readTree(String content)
:将 JSON 数据解析为 JsonNode 对象,可以用来进行更灵活的操作。
javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
String json = "{\"name\":\"John\", \"age\":30}";
JsonNode jsonNode = objectMapper.readTree(json);
String name = jsonNode.get("name").asText();
int age = jsonNode.get("age").asInt();
ObjectMapper
提供了丰富的功能和配置选项,可以根据需求进行定制化设置,用于处理各种复杂的 JSON 数据和对象转换场景。
activateDefaultTyping
和 setVisibility
都是 ObjectMapper
类中的方法,用于配置对象序列化和反序列化时的行为。
activateDefaultTyping
方法:
activateDefaultTyping
方法用于激活默认的类型信息处理功能,以便在序列化和反序列化过程中包含类型信息。这对于处理多态类型的对象非常有用,可以确保正确地恢复对象的实际类型。
javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
在这个例子中,我们激活了默认的类型信息处理功能,并指定了类型信息的存储方式为非最终(NON_FINAL),这意味着类型信息将被包含在序列化的 JSON 数据中。
setVisibility
方法:
setVisibility
方法用于设置对象的可见性规则,即序列化时哪些属性应该被包含或排除。可以通过 JsonMethod
参数指定序列化和反序列化时的可见性规则。
javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
在这个例子中,我们设置了所有属性的可见性为 NONE
,这意味着在序列化和反序列化时,所有属性都不会被包含。
通过这两个方法,可以对 ObjectMapper
的行为进行灵活的定制,以满足特定的序列化和反序列化需求。
@Resource
private RedisConnectionFactory factory;
@Bean
public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
//java对象与json格式的转换
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
在使用 Spring Data Redis 进行对象序列化和存储时,需要根据具体的场景和需求选择合适的序列化器。通常情况下,可以根据以下考虑来选择适当的序列化器:
- 存储格式需求:
- 如果需要将对象以 JSON 格式进行存储,并且希望能够方便地对存储的对象进行读取和反序列化操作,可以选择
Jackson2JsonRedisSerializer
,它能够将对象序列化为 JSON 数据,便于存储和处理。 - 如果只是简单地将字符串数据存储到 Redis,不需要对数据进行复杂的序列化和反序列化操作,可以选择
StringRedisSerializer
,它会将字符串直接序列化为字节数组存储到 Redis 中。
- 如果需要将对象以 JSON 格式进行存储,并且希望能够方便地对存储的对象进行读取和反序列化操作,可以选择
- 对象类型:
- 对于复杂的 Java 对象或包含多态类型的对象,使用
Jackson2JsonRedisSerializer
可以更好地处理对象之间的关系和类型信息。 - 对于简单的字符串数据,使用
StringRedisSerializer
足以满足需求,而且效率更高。
- 对于复杂的 Java 对象或包含多态类型的对象,使用
- 应用场景:
- 如果需要在 Redis 中存储的数据具有结构化的特征,需要进行查询或复杂操作时,使用
Jackson2JsonRedisSerializer
可以更好地支持对象的序列化和反序列化。 - 如果只是简单地存储和获取字符串数据,没有复杂的操作需求,使用
StringRedisSerializer
更为轻量和简单。
- 如果需要在 Redis 中存储的数据具有结构化的特征,需要进行查询或复杂操作时,使用
综上所述,选择合适的序列化器取决于具体的业务需求和数据存储的特点。根据需求选择适当的序列化器可以提高数据的存储效率和操作的便利性。