Jackson通过ObjectMapper进行Serialize&Deserialize

Serialized Object to String

	@Test
	public void testSerialized() throws JacksonException {
		//Jackson transfer Object tool
		ObjectMapper objMapper = new ObjectMapper();
		List<Buyer> buyers =  new ArrayList<Buyer>(
		List.of(new Buyer("1","Jeff"),new Buyer("2","Kevin")));
		
		Order order = Order.builder()
									.orderID(1)
									.orderName("TSL")
									.buyer(buyers).
									time(new Date())
									.des("Jackson test")
									.build();
		log.info(objMapper.writeValueAsString(order));
	}

{“time”:“2023/05/06 06:37:32”,“orderName”:“TSL”,
“des”:“Jackson test”,“buy”:[{“id”:“1”,“name”:“Jeff”},
{“id”:“2”,“name”:“Kevin”}]}

Deserialized String to Object

Order orderSerialized = objMapper.readValue(
"{\"time\":\"2023/05/06 06:37:32\",
\"orderName\":\"TSL\",\"des\":\"Jackson test\",
\"buy\":[{\"id\":\"1\",\"name\":\"Jeff\"},
{\"id\":\"2\",\"name\":\"Kevin\"}]}", 
Order.class);

System.out.println(orderSerialized);

Exception

在发序列化时,因缺少构造方法抛出InvalidDefinitionException: no Creator, cannot construct instance of object.

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of com.book.springtest.Buyer
(no Creators, like default constructor, exist): cannot deserialize
from Object value (no delegate- or property-based Creator)

在这里插入图片描述

<think>好的,我现在需要帮助用户了解如何使用Jackson库对Long类型进行序列化和反序列化。首先,我需要回顾一下Jackson的基本用法和相关配置。 根据引用[4],Jackson是Spring Boot默认的JSON解析器,性能优秀,支持多种数据格式。用户的问题集中在Long类型的处理上,可能涉及到大数值的精度丢失问题,比如前端JavaScript处理长整型时可能出现精度丢失,因此需要将Long序列化为字符串。 接下来,引用[5]提到可以通过自定义Jackson的配置,比如实现Jackson2ObjectMapperBuilderCustomizer接口来统一配置ObjectMapper。这可能是一个关键点,因为全局配置可以确保所有Long类型都被正确处理,而不需要在每个字段上单独注解。 然后,引用[2]提到@JsonDeserialize和@JsonSerialize注解,允许自定义序列化和反序列化方法。这可能适用于需要特定处理的个别字段,而不是全局配置的情况。 用户的需求可能包括两种场景:全局配置和单个字段配置。因此,回答需要涵盖这两种方法。首先,全局配置通过自定义模块或配置ObjectMapper,注册处理Long类型的序列化和反序列化器。其次,单个字段使用注解来指定转换方式。 需要注意的是,当Long值较大时,直接序列化为数字可能导致前端丢失精度,所以转成字符串是常见做法。反序列化时,需要能够将字符串解析回Long类型。 另外,引用[3]提到Jackson反序列化的规则,比如构造方法的执行顺序,但这里可能不相关。不过需要确保自定义的反序列化器能正确地将字符串转换为Long。 最后,需要确保提供的代码示例正确,比如创建自定义的JsonSerializer和JsonDeserializer,并在ObjectMapper中注册它们。同时,示例中使用Spring Boot的配置方式,通过Jackson2ObjectMapperBuilderCustomizer来应用配置,这样符合引用[5]的最佳实践。 可能还需要提到在Spring Boot应用中如何测试这些配置,比如编写测试用例验证序列化和反序列化的结果是否正确。此外,提醒用户如果手动创建ObjectMapper实例,需要应用相同的配置,否则不会生效,这也是引用[5]中提到的内容。 总结步骤: 1. 全局配置:自定义序列化器和反序列化器,并注册到ObjectMapper。 2. 单个字段配置:使用@JsonSerialize和@JsonDeserialize注解。 3. 提供代码示例,展示如何实现这两种方式。 4. 注意事项,比如前端精度问题和手动创建ObjectMapper的情况。 现在需要将这些整理成结构化的回答,确保覆盖用户的问题,并引用相关的资料支持。</think>### Jackson库对Long类型的序列化与反序列化实现 在Java开发中,使用Jackson处理$Long$类型时需特别注意**大数值精度丢失**问题(例如前端JavaScript处理长整型时可能丢失精度)。以下是两种实现方式: --- #### 一、全局配置(推荐) 通过自定义`ObjectMapper`配置,统一处理所有$Long$类型的序列化与反序列化。 ##### 1. 实现自定义序列化器 ```java public class LongToStringSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(value.toString()); // 将Long转为字符串 } } ``` ##### 2. 实现自定义反序列化器 ```java public class StringToLongDeserializer extends JsonDeserializer<Long> { @Override public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String text = p.getText(); return Long.parseLong(text); // 将字符串解析为Long } } ``` ##### 3. 注册到Spring Boot配置 ```java @Configuration public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer { @Override public void customize(Jackson2ObjectMapperBuilder builder) { SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, new LongToStringSerializer()); module.addDeserializer(Long.class, new StringToLongDeserializer()); builder.modules(module); } } ``` *此配置会将所有$Long$类型字段序列化为字符串,反序列化时自动转换回$Long$[^5]。* --- #### 二、单字段注解配置 若需仅对特定字段生效,使用`@JsonSerialize`和`@JsonDeserialize`注解。 ##### 示例实体类 ```java public class ExampleEntity { @JsonSerialize(using = LongToStringSerializer.class) @JsonDeserialize(using = StringToLongDeserializer.class) private Long id; // Getter/Setter省略 } ``` --- #### 三、测试验证 ```java @Test public void testLongSerialization() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(new ExampleEntity(123456789012345L)); Assert.assertEquals("{\"id\":\"123456789012345\"}", json); // 序列化结果应为字符串 ExampleEntity obj = mapper.readValue(json, ExampleEntity.class); Assert.assertEquals(123456789012345L, obj.getId()); // 反序列化后数值正确 } ``` --- #### 注意事项 1. **精度问题**:直接序列化$Long$为数字可能导致前端精度丢失,转为字符串可避免此问题。 2. **手动创建ObjectMapper**:若手动实例化`ObjectMapper`,需重复注册模块,否则配置不生效[^5]。 3. **兼容性**:确保反序列化时输入字符串为有效数字,否则会抛出`NumberFormatException`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值