ObjectMapper

仅作学习记录

ObjectMapper 是 Jackson 库中的一个类,用于实现 Java 对象(如 POJO、Map、List 等)与 JSON 数据之间的相互转换。通过 ObjectMapper,可以将 Java 对象序列化为 JSON 数据,也可以将 JSON 数据反序列化为 Java 对象。

以下是 ObjectMapper 的一些常用方法:

  1. 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);
  1. writeValueAsString(Object value):将 Java 对象转换为 JSON 字符串。
javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
User user = new User("John", 30);
String json = objectMapper.writeValueAsString(user);
  1. 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 数据和对象转换场景。

activateDefaultTypingsetVisibility 都是 ObjectMapper 类中的方法,用于配置对象序列化和反序列化时的行为。

  1. activateDefaultTyping 方法:

activateDefaultTyping 方法用于激活默认的类型信息处理功能,以便在序列化和反序列化过程中包含类型信息。这对于处理多态类型的对象非常有用,可以确保正确地恢复对象的实际类型。

javaCopy CodeObjectMapper objectMapper = new ObjectMapper();
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);

在这个例子中,我们激活了默认的类型信息处理功能,并指定了类型信息的存储方式为非最终(NON_FINAL),这意味着类型信息将被包含在序列化的 JSON 数据中。

  1. 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 进行对象序列化和存储时,需要根据具体的场景和需求选择合适的序列化器。通常情况下,可以根据以下考虑来选择适当的序列化器:

  1. 存储格式需求
    • 如果需要将对象以 JSON 格式进行存储,并且希望能够方便地对存储的对象进行读取和反序列化操作,可以选择 Jackson2JsonRedisSerializer,它能够将对象序列化为 JSON 数据,便于存储和处理。
    • 如果只是简单地将字符串数据存储到 Redis,不需要对数据进行复杂的序列化和反序列化操作,可以选择 StringRedisSerializer,它会将字符串直接序列化为字节数组存储到 Redis 中。
  2. 对象类型
    • 对于复杂的 Java 对象或包含多态类型的对象,使用 Jackson2JsonRedisSerializer 可以更好地处理对象之间的关系和类型信息。
    • 对于简单的字符串数据,使用 StringRedisSerializer 足以满足需求,而且效率更高。
  3. 应用场景
    • 如果需要在 Redis 中存储的数据具有结构化的特征,需要进行查询或复杂操作时,使用 Jackson2JsonRedisSerializer 可以更好地支持对象的序列化和反序列化。
    • 如果只是简单地存储和获取字符串数据,没有复杂的操作需求,使用 StringRedisSerializer 更为轻量和简单。

综上所述,选择合适的序列化器取决于具体的业务需求和数据存储的特点。根据需求选择适当的序列化器可以提高数据的存储效率和操作的便利性。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值