繁体   English   中英

json反序列化因有效格式而失败

[英]json deserialization fail for valid format

我有一个日期如下的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

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

绒球:

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

如果您使用的是 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;
    }
}

输出

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

编辑如果要使用注释指定日期格式,请使用 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;
    }
}

输出:

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

基本上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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM