Java JSON数据反序列化
我从前端获取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
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