当前位置: 首页 > 知识库问答 >
问题:

LocalDateTime不转换为字符串,而是转换为Json对象

闻人宇定
2023-03-14

我想序列化java.time类型的创建日期。调用spring data rest服务时,LocalDateTime为String。实体的字段用DateTimeFormat(iso=iso.DATE_TIME)进行注释。我还在Spring Configuration类中注册了LocalData到String转换器。

@Override
@Bean
protected ConversionService neo4jConversionService() throws Exception {
    ConversionService conversionService = super.neo4jConversionService();
    ConverterRegistry registry = (ConverterRegistry) conversionService;
    registry.removeConvertible(LocalDateTime.class, String.class);
    registry.removeConvertible(String.class, LocalDateTime.class);
    registry.addConverter(new DateToStringConverter());
    registry.addConverter(new StringToDateConverter());
    return conversionService;
}

private class DateToStringConverter implements Converter<LocalDateTime, String> {
    @Override
    public String convert(LocalDateTime source) {
        return source.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    }
}

但是没有调用转换器,创建日期被序列化为Json结构,如下所示:

creationDate: {
  dayOfYear: 337,
  monthValue: 12,
  hour: 10,
  minute: 15,
  second: 30,
  nano: 0,
  year: 2011,
  month: "DECEMBER",
  dayOfMonth: 3,
  dayOfWeek: "SATURDAY",
  chronology: {
  id: "ISO",
  calendarType: "iso8601"
}

这是实体定义:

@NodeEntity
public class CmmnElement {}
public class Definitions extends CmmnElement {
  @DateTimeFormat(iso = ISO.DATE_TIME)
  private LocalDateTime creationDate;
}

简单的存储库如下所示:

@RepositoryRestResource(collectionResourceRel="definitions", path="/definitions")
public interface DefinitionsRepository extends PagingAndSortingRepository<Definitions, Long>{}

creationDate由LocalDateTime创建。parse()从字符串“2011-12-03T10:15:30”。

我在github上有一个例子:https://github.com/gfinger/neo4j-tests/tree/master/neo-spring-testLeaf类有一个LocalDateTime类型的creationDate。如果您运行mvn sping-引导:运行嵌入的Neoi4J DB会使用Leaf实例进行初始化。调用http://localhost:8080/leaf{?页面、大小、排序}将日期显示为json结构。

如何取回这个String而不是Json对象?

共有2个答案

姚才捷
2023-03-14

我在Spring mvc 中遇到了类似的问题。添加杰克逊数据类型-jsr310 的依赖项并不能解决我的问题,而是自定义格式化程序完成了这项工作。

在这里,我发现 https://stackoverflow.com/a/34548741/9091816

public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime>{
    private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
    
    @Override
    public void serialize(LocalDateTime dateTime, JsonGenerator generator, SerializerProvider sp)
            throws IOException, JsonProcessingException {
        String formattedDateTime = dateTime.format(DateTimeFormatter.ofPattern(dateTimeFormat)); 
        generator.writeString( formattedDateTime);
    }
}

并在LocalDateTime字段中使用该自定义序列化程序:

@JsonSerialize(using = CustomLocalDateTimeSerializer.class)
private LocalDateTime creationDate;
贺彬
2023-03-14

好的,很抱歉耽搁了。我检查了它,如果您查看target/cmmn中的Neo4j数据库。db它显示日期已正确序列化为字符串。

bin/neo4j-shell -path target/cmmn.db/

neo4j-sh (?)$ match (n) return *
> ;
+--------------------------------------------------------------------------------------+
| n                                                                                    |
+--------------------------------------------------------------------------------------+
| Node[0]{name:"Senat"}                                                                |
| Node[1]{name:"Cato",description:"Ceterum Censeo",creationDate:"2011-12-03T10:15:30"} |
+--------------------------------------------------------------------------------------+
2 rows

我认为问题出在sping-data-rest的json转换器上,它可能没有为LocalDateTime配置。

您必须将其添加为依赖项:

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.4.5</version>
    </dependency>

然后,树叶渲染为:

  "name" : "Cato",
  "description" : "Ceterum Censeo",
  "creationDate" : "2011-12-03T10:15:30",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/leaf/7"
    }

请参阅: https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#customizing-the-jackson-objectmapper

 类似资料:
  • 问题内容: 我正在使用JS对象通过Google可视化创建图形。我正在尝试设计数据源。首先,我创建了一个JS对象客户端。 现在,我需要动态获取数据。因此,我将AJAX请求发送到返回JSON字符串的页面: 我将其保存到变量中: 并显示为 现在,我的任务是从该字符串创建一个JS对象。这是行不通的。当我使用JS对象时,一切工作正常,并且能够获得所需的图形。现在,如果我尝试从警报消息中确认的来自AJAX请求

  • 问题内容: 将字符串表示形式转换为对象,但我要相反。对象要转换为JSON字符串,我有一个链接http://www.devcurry.com/2010/03/convert- javascript-object-to-json.html, 但是它需要json2.js jQuery是否具有本机功能方法来做到这一点? 问题答案: jQuery只会在调用本机浏览器方法之前进行一些正则表达式检查。如果不可用

  • 问题内容: 如何使用JavaScript(或jQuery)将描述对象的字符串转换为JSON字符串? 例如:转换这个( 不是 有效的JSON字符串): 到这个: 如果可能,我希望避免使用。 问题答案: 如果字符串是来自可靠来源 ,你可以使用然后的结果。像这样: 请注意,当您使用对象文字时,必须将其括在圆括号中,否则将花括号解析为块而不是对象。 我也同意以下问题的评论,那就是最好以有效的JSON开始编

  • 问题内容: 您如何使JS认为字符串是JSON? 我有一个仅在将JSON对象传递给它的情况下才起作用的函数。如果我以与JSON相同的格式将字符串传递给它,则它将不起作用。因此,我想让该函数认为传递给它的字符串是JSON。该字符串确实采用JSON格式。 我还尝试了以下方法。我通过Ajax输入了字符串,参数“ handle as”为“ JSON”,然后将结果传递给函数。 所以我推断出问题不在弦上。如何将

  • 我有一个RestController类,它有一个方法可以根据电影的标题搜索电影: 如果我发送一个json字符串 从邮递员到endpoint,我收到一个空白的回复。 然后我做了一个 就在进入方法后找到字符串filmSearch正是我从邮递员发送的JSON字符串。我的应用程序没有看到JSON和提取值从filmSearch在我的请求附加到应用程序内字符串filmSearch. 如果我移除 在请求映射的一

  • 问题内容: 如果我用以下方法在JS中定义了一个对象: 如何将对象转换为JSON?输出字符串应为: 问题答案: 当前所有的浏览器都内置了本机JSON支持。因此,只要您不使用IE6 / 7之类的史前浏览器,就可以像这样轻松地做到这一点: