json JacksonMap器扩展LocalDate

hlswsv35  于 2023-03-04  发布在  其他
关注(0)|答案(3)|浏览(143)

我们有一个使用LocalDate定义的DTO:

@JsonProperty("dob")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate dob;

我们有一个ObjectMapper的代码,定义如下:

private static final ObjectMapper makeMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new ParameterNamesModule());
    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());
    return mapper;
}

我们在pom.xml文件中有所有的jackson-databindm内核jsr310:

<!-- Jackson JSON Mapping -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.8.8</version>
    </dependency>

因此,当我将对象转换为JSON字符串时:

String json = makeMapper().writeValueAsString(myobject);

dob写入JSON字符串如下:
"出生日期":{"年份":1964年,"月":"二月","年表":{"日历类型":"iso8601","识别码":"ISO "},"月值":2、"月天数":13,"星期几":"星期四"、"时代":"CE"、"日期":44、"闰年":真}
将"出生日期"改为"1964 - 02 - 13",这是正确的。
所以,我不知道我是怎么做到的?
我想确保日期写得正确,这样我就可以重新解析回LocalDate。或者,有没有一种方法可以把现有的JSON(展开的)解析回LocalDate?
谢谢!

8cdiaqws

8cdiaqws1#

结果发现这是ClassLoader的问题。在最小的情况下,代码正常工作,LocalDate相应地转换为JSON。当您将一个项目嵌入到另一个项目中时,所发生的情况是ObjectMapper在没有JavaTimeModule的其他地方定义。
我把代码:

private static final ObjectMapper makeMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new ParameterNamesModule());
    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());
    return mapper;
}

把它带到我需要它的课堂上,这很有效。从不同的项目中访问实用程序对我来说不起作用。
希望这对其他人有帮助。

qeeaahzv

qeeaahzv2#

com.fasterxml.jackson.core:jackson-databind:2.9.7中,可以使用以下代码实现LocalDate变通方案:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.registerModule(new JavaTimeModule());
String expectedJson = objectMapper.writeValueAsString(dataVersions);
xv8emn3q

xv8emn3q3#

1.进口依赖度:jackson-数据类型-jsr310
1.编写扩展类:JsonJackson编解码器扩展

package org.wjw.redisson;

import org.redisson.codec.JsonJacksonCodec;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

/** 对 {@link org.redisson.codec.JsonJacksonCodec} 的扩展,是的其能支持LocalDate
 * The Class JsonJacksonCodecExt.
 */
public class JsonJacksonCodecExt extends JsonJacksonCodec{
  @Override
  protected void init(ObjectMapper objectMapper) {
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    
    super.init(objectMapper);    
  }
  
}

1.试验代码

@Test
  void testRMap_PutGet_JsonStringCodec() {
    RMap<String, User> map = redisson.getMap("jsonMap",new JsonJacksonCodecExt());
    map.put("1", new User("wjw1", 18, LocalDate.now()));
    map.put("2", new User("wjw2", 19, LocalDate.now()));
    map.put("3", new User("wjw3", 20, LocalDate.now()));

    User v = map.get("2");

    System.out.println(v);
  }

相关问题