来自PostMan的POST日期应用程序/ json时无法解析日期

时间:2017-12-10 13:57:23

标签: java hibernate maven annotations jersey

我得到了无法解析的日期异常。经过大量搜索后,我尝试使用Locale.US和Locale.ENGLISH以及dateFormat:" yyyy-MM-dd HH:mm:ss z"但仍然是同样的错误。所以我尝试使用Jackson-dataFormat中的注释,所以我用这个模式得到了这个模式并尝试使用模式" yyyy-MM-dd HH:mm:ss z"太:

@Column(name="date", nullable=false)
@Temporal(TemporalType.DATE)
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ssZ")
private Date date;

我的dateInString是:" 2017-12-23T20:30:15.000Z"。 我真的不知道哪里可以例外。

 try {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
        this.date = (Date)formatter.parse(dateInString);            
    }
    catch(ParseException e) {
        e.printStackTrace();
    }       

也许这些信息会有所帮助。在我的数据库中,该列被命名为日期,并且是DATE类型。 (我可以在phpMyAdmin中选择DATE或DATETIME类型)。

一开始,我认为这是因为我忘记了Locale.X参数,但仍然是例外。

错误:

Caused by: com.owlike.genson.JsonBindingException: Could not parse date 2017-12-23T20:30:15.000Z
    at com.owlike.genson.convert.DefaultConverters$DateConverter.deserialize(DefaultConverters.java:815)
    at com.owlike.genson.convert.DefaultConverters$DateConverter.deserialize(DefaultConverters.java:781)
    at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:57)
    at com.owlike.genson.reflect.PropertyMutator.deserialize(PropertyMutator.java:30)
    ... 46 more
Caused by: java.text.ParseException: Unparseable date: "2017-12-23T20:30:15.000Z"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at com.owlike.genson.convert.DefaultConverters$DateConverter.read(DefaultConverters.java:821)
    at com.owlike.genson.convert.DefaultConverters$DateConverter.deserialize(DefaultConverters.java:813)
    ... 49 more

所以我也得到了这个错误,但这是因为我的解析不起作用:

Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to type class model.SessionActivity
    at com.owlike.genson.Genson.deserialize(Genson.java:442)
    at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:125)
    ... 40 more
Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to property 'date' of class class model.SessionActivity
    at com.owlike.genson.reflect.PropertyMutator.couldNotDeserialize(PropertyMutator.java:49)
    at com.owlike.genson.reflect.PropertyMutator.deserialize(PropertyMutator.java:32)
    at com.owlike.genson.reflect.BeanDescriptor.deserialize(BeanDescriptor.java:110)
    at com.owlike.genson.reflect.BeanDescriptor.deserialize(BeanDescriptor.java:93)
    at com.owlike.genson.convert.BeanViewConverter.deserialize(BeanViewConverter.java:105)
    at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:57)
    at com.owlike.genson.Genson.deserialize(Genson.java:440)
    ... 41 more

主题已经存在,我读了它们并尝试解决这些回复,但实际上都没有。

这是我的POST json请求:

enter image description here

尝试使用ISO 8601:2017-12-23T20:30:15.000Z

首先,我在WebService类中处理POST请求:

@POST
@Path("/")
@Consumes(MediaType.APPLICATION_JSON)
public Response addSession(SessionActivity sessionActivity) {       
    SessionDAO.add(sessionActivity);
    return Response.ok().build();
}

调用DAO会话的add():

public static void add(SessionActivity sessionActivity){
    try {
        session = SessionUtil.getSession();
        Transaction tx = session.beginTransaction();

        session.save(sessionActivity);        
        tx.commit();
        session.close();
    }
    catch(Exception e) {
        System.out.println( "ADD sessionActivity non effectué :" );
        e.printStackTrace();
    }
}

然后这是我的模特:

@Column(name="date", nullable=false)
    @Temporal(TemporalType.DATE)
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ssZ")
    private Date date;

    public SessionActivity(Long id, User user, Date date) {
    super();
    this.id = id;
    this.user = user;
    this.date = date;

    /*
    try {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
        this.date = (Date)formatter.parse(dateInString);            
    }
    catch(ParseException e) {
        e.printStackTrace();
    }*/   
}

1 个答案:

答案 0 :(得分:1)

json日期的格式为ISO 8601:2017-12-23T20:30:15.000Z

带有这样的值的json应该解析为java Date而不必进行任何转换。反之亦然。

顺便说一句,Z在结尾意味着它是Zulu或GMT 0时间。因此,在将值解析为java Date之后,您可以使用时间分区方法来获取特定区域设置的值。

编辑我

我认为您使用的解析器存在一些问题。我使用您正在使用的Genson解析器和使用Gson的相同测试运行测试,使用相同的json文本,而Genson无法解析日期,Gson解析它没有问题。

以下是测试,您必须评论您不想执行的行。

另请注意,我必须为Genson注释DatedObject类构造函数才能找到它(public DatedObject(@JaonParam("date") Date date, JsonParam("user") String user){

import com.google.gson.Gson;
import com.owlike.genson.Genson;
import com.owlike.genson.annotation.JsonProperty;

public class JsonParseDate {
    public String json = "{\"date\":\"2017-12-23T20:30:15.000Z\",\"user_fk\":\"1\"}";

    public static void main(String [] args){
        JsonParseDate app = new JsonParseDate();
        app.go();
    }

    private void go(){

        // Comment next two lines to run with Gson (and uncomment the Gson lines)
        // Genson genson = new Genson();
        // DatedObject datedObject = genson.deserialize(json, DatedObject.class);

        // Comment next two lines to run with Genson (and uncomment Genson lines)
        Gson gson = new Gson();
        DatedObject datedObject = gson.fromJson(json, DatedObject.class);
        System.out.println(datedObject.date);

    }

    public static class DatedObject{
        public Date date;
        public String user;

        public DatedObject(Date date, String user){
            this.date = date;
            this.user = user;
        }
    }
}

Ref to Genson user guide

对于Gson,如果您使用maven,可以从maven获取jar或将依赖性添加到pom中。