【问题标题】:json deserialization fail for valid formatjson反序列化对于有效格式失败
【发布时间】:2020-01-30 04:21:04
【问题描述】:

我有一个日期如下的 json 文件:

{
...
  "dob":"20001010",
  "registerdate":"20001010121212",
...
}

我在课堂上使用:

public class User implements Serializable {
... some other
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd
    public java.util.Date dob; // this works

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMddHHmmss")
    public java.util.Date registerdate;
}

然后在我的测试中我使用 Gson 来转换文件

User user = new Gson().fromJson("user.json", User.class);

但是当这个运行时,我得到:

com.google.gson.JsonSyntaxException: 20001010121212

我与:yyyyMMddHHmmss 或 YYYYMMddHHmmss 或 YYYYMMDDHHmmss 相同的结果

pom:

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

【问题讨论】:

  • 请提供Gson lib的版本
  • 我正在使用:2.8.5
  • @JsonFormat 是 Jackson 注释,而不是 Gson 注释。如果您的类路径中已经有 Jackson,请使用它将 Json 文本解析为 User 对象。
  • @Andreas 不知道该怎么办那我该怎么办?
  • @yenk 我已经告诉过你了:使用 Jackson 来解析。

标签: java json date


【解决方案1】:

基本上 com.google.gson.Gson 无法识别注释 com.fasterxml.jackson.annotation.JsonFormat(两个不同的库)

这是另一种仅使用来自 fastxml lib 的 ObjectMapper 的解决方案

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.Serializable;
import java.util.Date;

public class DemoApplication {
    public static void main(String[] args) throws JsonProcessingException {
        String json = "{\"dob\":\"20001010121212\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);
        System.out.println(user.dob);
    }
}

class User implements Serializable {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMddHHmmss")
    public Date dob;
}

【讨论】:

  • 为什么我得到:10 月 10 日星期二 05:12:12 PDT .. 我应该得到:10 月 10 日星期二 12:12:12 PDT
  • 我得到它的工作,没有意识到 PST 与 GMT 啊!感谢您的帮助(比@Andreas 更好的帮助)
【解决方案2】:

如果您使用 GSON,则需要解析日期,例如

import java.util.Date;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GSONExample {

    private static String json = "{\r\n" + "  \"dob\":\"20001010121212\"\r\n" + "}";

    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setDateFormat("yyyyMMddHHmmss").create();
        ItemDob itemDob = gson.fromJson(json, ItemDob.class);
        System.out.println(itemDob.getDob());
    }

}

class ItemDob {
    private Date dob;

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
}

输出

10 月 10 日星期二 12:12:12 IST 2000

编辑 如果要使用注释指定日期格式,请使用 jackson。例如,

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {

    private static String json = "{\r\n" + 
            "  \"dob\": \"20001010121212\"\r\n" + 
            "}";

    public static void main(String[] args) throws JsonMappingException, JsonProcessingException {
        ItemDob itemDob = new ObjectMapper().readValue(json, ItemDob.class);
        System.out.println(itemDob.getDob());
    }

}

class ItemDob {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMddHHmmss")
    private Date dob;

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
}

输出:

10 月 10 日星期二 17:42:12 IST 2000

【讨论】:

  • 如果我有其他格式不同的日期也可以使用?
  • @yenk 不,所以use Jackson
  • 是的,您必须使用 GsonBuilder 为每种日期格式创建新的 Gson 对象。但是,如果您想使用基于注释的日期格式,请使用 jackson。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2019-01-14
相关资源
最近更新 更多