[英]JSON data deserialization
我從前端獲得此JSON數據:
user {"idUser":5,"fullname":"Bob Marley", "birthday":"1990-12-14", "login":"b.marley", "password":"none","dateCreate":"2014-10-09 15:01","grp":{"idGrp":"2","nameGrp":"client"}}
我想在Java中反序列化這些數據:
User.java
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int idUser;
private String fullname;
private Date birthday;
private String login;
private String password;
private Date dateCreate;
private Grp grp;
//getters and setters
UserDeserializer.java
public class UserDeserializer implements JsonDeserializer<User> {
@Override
public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jObject = json.getAsJsonObject();
User user = new User();
user.setIdUser(jObject.get("idUser").getAsInt());
user.setFullname(jObject.get("fullname").getAsString());
try {
Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse(jObject.get("birthday").getAsString());
user.setBirthday(birthday);
} catch (ParseException e) {
}
user.setLogin(jObject.get("login").getAsString());
user.setPassword(jObject.get("password").getAsString());
try {
Date dateCreate = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(jObject.get("dateCreate").getAsString());
user.setDateCreate(dateCreate);
} catch (ParseException e) {
}
Grp grp = context.deserialize(jObject.get("grp"), Grp.class);
user.setGrp(grp);
return user;
}
}
UserEdit.java
public class UserEdit extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = new GsonBuilder().create();
User user = gson.fromJson(request.getParameter("user"), User.class);
我在UserEdit.java的最后一行收到此錯誤:
2014年11月4日21:30:44.003嚴重[http-apr-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet [Servlet UserEdit]的Servlet.service()與路徑[]在com.google.gson.internal.bind.DateTypeAdapter.read上拋出com.google.gson.JsonSyntaxException:1990-12-14 com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81) (com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41)處的(DateTypeAdapter.java:66)at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.read(ReflectiveTypeAdapterFactory.java:95)在com.google.gson.Gson.fromJson的com.google.gson.Gson.fromJson(Gson.java:805)的com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.read(ReflectiveTypeAdapterFactory.java:183) (com.google.gson.Gson.fromJson(Gson.java:719)處的com.google.gson.Gson.fromJson(Gson.java:691)處的com.gmail.zigfridus.UserEdit(Gson.java:770)。 javax.servlet.http.HttpServlet.se上的doGet(UserEdit.java:24) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)的javax.servlet.http.HttpServlet.service(HttpServlet.java:725)的rvice(HttpServlet.java:618) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)處的.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java) :239)位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206),位於org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219),位於org.apache.catalina.core。 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)的org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)的StandardContextValve.invoke(StandardContextValve.java:106) org.apache.catalin上的.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)上的a.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 526)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:652)at org.apache.coyote.http11.Http11AprProtocol org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2451)處的$ Http11ConnectionHandler.process(Http11AprProtocol.java:277)在org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run (AprEndpoint.java:2440)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread。 run(Thread.java:722)原因:java.text.ParseException:無法解析的日期:java.text.DateF上的“ 1990-12-14” 位於com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79)的ormat.parse(DateFormat.java:357)...更多32
它說該錯誤是由於生日,但該日期看起來很正常。
請幫我。
這里 :
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = new GsonBuilder().create();
您正在創建一個新的GsonBuilder
,實際上是關閉了剛剛配置的GsonBuilder
。 采用
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = gsonBuilder.create();
使用配置了用戶解串器的gsonBuilder。
使用yyyy-MM-dd HH:mm:ss
作為簡單的日期格式。 我知道您沒有小時,分鍾和秒,但是我不相信沒有它們,它不會接受。
您將需要為hh:mm:ss添加值,以實例化可接受的日期格式。 您顯然與時間無關,在這種情況下,我建議您僅使用00:00:00。
錯誤似乎是在API內部綁定中使用DateTypeAdapter ...我對該庫不熟悉,但是也許您的UserDeserializer沒有在API /框架中正確配置,並且使用了默認值(並且生日是bean中的Date到反序列化)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.