Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON数据反序列化_Java_Json_Deserialization - Fatal编程技术网

Java JSON数据反序列化

Java JSON数据反序列化,java,json,deserialization,Java,Json,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

我从前端获取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
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;
    }
}
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);
UserDeserializer.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
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;
    }
}
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.service() 对于路径为[]的上下文中的servlet[servlet UserEdit],引发异常 com.google.gson.JsonSyntaxException:1990-12-14 at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81) 在 com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) 在 com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41) 在 com.google.gson.internal.bind.ReflectTypeAdapterFactory$1.read(reflectTypeAdapterFactory.java:95) 在 com.google.gson.internal.bind.ReflectTypeAdapterFactory$Adapter.read(ReflectTypeAdapterFactory.java:183) 在com.google.gson.gson.fromJson(gson.java:805)上 fromJson(gson.java:770)位于 fromJson(gson.java:719)位于 fromJson(gson.java:691)位于 com.gmail.zigfridus.UserEdit.doGet(UserEdit.java:24)位于 http.HttpServlet.service(HttpServlet.java:618)位于 http.HttpServlet.service(HttpServlet.java:725)位于 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 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.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652) 在 org.apache.coyote.http11.http11aprotocol$Http11ConnectionHandler.process(http11aprotocol.java:277) 在 org.apache.tomcat.util.net.aprependpoint$SocketProcessor.doRun(aprependpoint.java:2451) 在 org.apache.tomcat.util.net.aprependpoint$SocketProcessor.run(aprependpoint.java:2440) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:722)处,由以下原因引起: java.text.ParseException:无法解析的日期:“1990-12-14”在 java.text.DateFormat.parse(DateFormat.java:357)位于 com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79) ... 32多

上面说错误是因为生日,但那个日期看起来很正常


请帮帮我。

使用
yyyy-MM-dd HH:MM:ss
作为简单的日期格式。我知道你没有小时、分钟和秒,但我不相信没有它们它就可以接受。

使用
yyyy-MM-dd HH:MM:ss
作为简单的日期格式。我知道您没有小时、分钟和秒,但我不认为没有它们它就可以接受。

您需要为hh:mm:ss添加值,以便实例化可接受的日期格式。显然,您并不关心时间,在本例中,我建议只使用00:00:00。

您需要为hh:mm:ss添加值,以便实例化可接受的日期格式。显然,您并不关心时间,在本例中,我建议只使用00:00:00。

错误似乎是在API内部绑定中使用DateTypeAdapter。。。
我不熟悉这个库,但可能您的UserDeserializer没有在API/框架中正确配置,并且使用了默认的反序列化器(生日是要反序列化的bean中的日期)

错误似乎是在API内部绑定中使用了DateTypeAdapter。。。 我不熟悉这个库,但可能您的UserDeserializer没有在API/框架中正确配置,使用了默认的(生日是要反序列化的bean中的日期)

这里:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = new GsonBuilder().create();
您正在创建一个新的
GsonBuilder
,有效地删除了刚才配置的一个。使用

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = gsonBuilder.create();
要使用配置了用户反序列化器的gsonBuilder,请执行以下操作:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = new GsonBuilder().create();
您正在创建一个新的
GsonBuilder
,有效地删除了刚才配置的一个。使用

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

要使用配置了用户反序列化器的gsonBuilder。

JSON
用户{“idUser”:5开头的
用户
生成了格式错误的JSON。开始时真的有
用户
吗?@Vinze:你指的是哪一个,处理“任何问题”?zigfridus你确定你的
反序列化
方法被调用了吗?@JonathanM是的,确实有
用户
在开头:
http://localhost:8080/UserEdit?user=%7B%22idUser%22%3A5%2C%22...
@njzk2我错读了这个问题,我想…删除了我的评论。用户代码中似乎没有堆栈条目,因此可能是误用了f API…the