简体   繁体   English

JSON数据反序列化

[英]JSON data deserialization

I get this JSON data from front-end: 我从前端获得此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"}}

I want to do deserialization these data in java: 我想在Java中反序列化这些数据:

User.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 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 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);

And I get this error at the last row of the UserEdit.java: 我在UserEdit.java的最后一行收到此错误:

04-Nov-2014 21:30:44.003 SEVERE [http-apr-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Servlet UserEdit] in context with path [] threw exception com.google.gson.JsonSyntaxException: 1990-12-14 at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81) at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:95) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:183) at com.google.gson.Gson.fromJson(Gson.java:805) at com.google.gson.Gson.fromJson(Gson.java:770) at com.google.gson.Gson.fromJson(Gson.java:719) at com.google.gson.Gson.fromJson(Gson.java:691) at com.gmail.zigfridus.UserEdit.doGet(UserEdit.java:24) at javax.servlet.http.HttpServlet.se 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) rvice(HttpServlet.java:618) at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74) at org.apache.catalin 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) a.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at 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$Http11ConnectionHandler.process(Http11AprProtocol.java:277) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2451) at 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) Caused by: java.text.ParseException: Unparseable date: "1990-12-14" at java.text.DateF 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” ormat.parse(DateFormat.java:357) at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79) ... 32 more 位于com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79)的ormat.parse(DateFormat.java:357)...更多32

It says that error is because of birthday date, but that date looks like normal. 它说该错误是由于生日,但该日期看起来很正常。

Please, help me. 请帮我。

Here : 这里 :

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = new GsonBuilder().create();

You are creating a new GsonBuilder , effectively dismissing the one you just configured. 您正在创建一个新的GsonBuilder ,实际上是关闭了刚刚配置的GsonBuilder Use 采用

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = gsonBuilder.create();

to use the gsonBuilder configured with the user deserializer. 使用配置了用户解串器的gsonBuilder。

Use yyyy-MM-dd HH:mm:ss as your simple date format. 使用yyyy-MM-dd HH:mm:ss作为简单的日期格式。 I know you don't have hours, minutes and seconds, but I don't believe that it accepts it without them. 我知道您没有小时,分钟和秒,但是我不相信没有它们,它不会接受。

You will need to add values for hh:mm:ss in order to instantiate an acceptable date format. 您将需要为hh:mm:ss添加值,以实例化可接受的日期格式。 You obviously aren't concerned with the time and in this case I would suggest simply using 00:00:00. 您显然与时间无关,在这种情况下,我建议您仅使用00:00:00。

错误似乎是在API内部绑定中使用DateTypeAdapter ...我对该库不熟悉,但是也许您的UserDeserializer没有在API /框架中正确配置,并且使用了默认值(并且生日是bean中的Date到反序列化)

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

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