我得到了无法解析的日期异常。经过大量搜索后,我尝试使用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请求:
尝试使用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();
}*/
}
答案 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;
}
}
}
对于Gson,如果您使用maven,可以从maven获取jar或将依赖性添加到pom中。