alibaba / alibaba/fastjson2

[BUG]

Open
#1,397 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
4.4k
Forks
613
Avg merge
1d 22h
Merged PRs (30d)
6

Description

上次提的android环境下日期序列化异常的,经测试2.0.29,在没有嵌套的时候android环境已经正常了,但是在有嵌套对象的时候依旧有异常:
完整的测试样例数据数目如下:

1.后台返回的接口数据如下:
{
"app":
{"clientcode":52302,"appdesc":"nfc云解码","eidmcid":"009iii","eidappid":"kkkkkk","clientport":9989,"desinfo":"eid云解码V2.1.4.beat","url":"url","logout":0,"enddate":1863792000000,"appname":"生产nfc云解码","appid":"1C1154257E22C7C8C63814B4B3832308","clientip":"eidcloudread.eidlink.com","skey":"nvRywksjFpIP5g88OnUrmfXjKNeeX6OJ2AmukmAy7rWhxyz8mu9LZjrdmBcocQ9a","appcode":"eidSZNfc","keystart":10,"versioncode":94,"versionname":"eid云解码V2.1.4.beat"},
"user":{"devid":"4B1011C167EE8B821BFBB6FC1A7C6E0D","authstatus":1,"createtime":1681115015000,"creator":"NullLogin","areaname":"宝安区西乡街道","readmode":0,"userid":"C70C48D656BE4ECF92AABAB4968C980D","authtype":2,"updater":"B75A783E1E30C0A51CB9757FC28C9655","logout":0,"areaid":440306018000000000,"authdate":1893340800000,"phone":"17312340000","appid":"1C1154257E22C7C8C63814B4B3832308","name":"Liyc","id":"C70C48D656BE4ECF92AABAB4968C980D","updatetime":1681115583000}
}

2. 最终目标是要把文本数据反序列化成BackBean 对象
BackBean back = JSONObject.parseObject(text, BackBean.class);

以下是各个对象的原始信息如下:

BackBean 对象如下:
public class BackBean {
private static final long serialVersionUID = 1L;
private AppBean app;

private UserBean user;

public AppBean getApp() {
return app;
}

public void setApp(AppBean app) {
this.app = app;
}

public UserBean getUser() {
return user;
}

public void setUser(UserBean user) {
this.user = user;
}
}

UserBean对象如下:
public class UserBean {
private static final long serialVersionUID = 1L;

private Long areaid;

private String areaname;

private String appid;

private String name;

private String phone;

private Integer cardtype;

private String cardno;

private String userid;

private String unitname;

private Integer logout;

private String devid;

private Integer authtype;

private Integer authstatus;

@JSONField(locale = "zh", format = "yyyy-MM-dd")
private Date authdate;

private String desinfo;

private Integer readmode;

public Long getAreaid() {
return areaid;
}

public void setAreaid(Long areaid) {
this.areaid = areaid;
}

public String getAreaname() {
return areaname;
}

public void setAreaname(String areaname) {
this.areaname = areaname;
}

public String getAppid() {
return appid;
}

public void setAppid(String appid) {
this.appid = appid;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public Integer getCardtype() {
return cardtype;
}

public void setCardtype(Integer cardtype) {
this.cardtype = cardtype;
}

public String getCardno() {
return cardno;
}

public void setCardno(String cardno) {
this.cardno = cardno;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getUnitname() {
return unitname;
}

public void setUnitname(String unitname) {
this.unitname = unitname;
}

public Integer getLogout() {
return logout;
}

public void setLogout(Integer logout) {
this.logout = logout;
}

public String getDevid() {
return devid;
}

public void setDevid(String devid) {
this.devid = devid;
}

public Integer getAuthtype() {
return authtype;
}

public void setAuthtype(Integer authtype) {
this.authtype = authtype;
}

public Integer getAuthstatus() {
return authstatus;
}

public void setAuthstatus(Integer authstatus) {
this.authstatus = authstatus;
}

public Date getAuthdate() {
return authdate;
}

public void setAuthdate(Date authdate) {
this.authdate = authdate;
}

public String getDesinfo() {
return desinfo;
}

public void setDesinfo(String desinfo) {
this.desinfo = desinfo;
}

public Integer getReadmode() {
return readmode;
}

public void setReadmode(Integer readmode) {
this.readmode = readmode;
}
}

AppBean继承了AppInfo:
public class AppBean extends AppInfo {
private static final long serialVersionUID = 1L;

private String appid;

private Integer logout;

private String skey;

private Integer keystart;

private String eidmcid;

private String eidappid;

private String clientip;

private Integer clientport;

private Integer clientcode;

@JSONField(locale = "zh", format = "yyyy-MM-dd")
private Date enddate;

public String getAppid() {
return appid;
}

public void setAppid(String appid) {
this.appid = appid;
}

public Integer getLogout() {
return logout;
}

public void setLogout(Integer logout) {
this.logout = logout;
}

public String getSkey() {
return skey;
}

public void setSkey(String skey) {
this.skey = skey;
}

public Integer getKeystart() {
return keystart;
}

public void setKeystart(Integer keystart) {
this.keystart = keystart;
}

public String getEidmcid() {
return eidmcid;
}

public void setEidmcid(String eidmcid) {
this.eidmcid = eidmcid;
}

public String getEidappid() {
return eidappid;
}

public void setEidappid(String eidappid) {
this.eidappid = eidappid;
}

public String getClientip() {
return clientip;
}

public void setClientip(String clientip) {
this.clientip = clientip;
}

public Integer getClientport() {
return clientport;
}

public void setClientport(Integer clientport) {
this.clientport = clientport;
}

public Integer getClientcode() {
return clientcode;
}

public void setClientcode(Integer clientcode) {
this.clientcode = clientcode;
}

public Date getEnddate() {
return enddate;
}

public void setEnddate(Date enddate) {
this.enddate = enddate;
}
}

AppInfo对象如下:
public class AppInfo implements Serializable {
private static final long serialVersionUID = 1L;

private String appcode;

private String appname;

private String appdesc;

private Integer versioncode = 0;

private String versionname;

private String desinfo;

private String url;

private boolean force = true;

public String getAppcode() {
return appcode;
}

public void setAppcode(String appcode) {
this.appcode = appcode;
}

public String getAppname() {
return appname;
}

public void setAppname(String appname) {
this.appname = appname;
}

public String getAppdesc() {
return appdesc;
}

public void setAppdesc(String appdesc) {
this.appdesc = appdesc;
}

public Integer getVersioncode() {
return versioncode;
}

public void setVersioncode(Integer versioncode) {
this.versioncode = versioncode;
}

public String getVersionname() {
return versionname;
}

public void setVersionname(String versionname) {
this.versionname = versionname;
}

public String getDesinfo() {
return desinfo;
}

public void setDesinfo(String desinfo) {
this.desinfo = desinfo;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public boolean isForce() {
return force;
}

public void setForce(boolean force) {
this.force = force;
}
}

Contributor guide

Open the contributing guide

Research direction

Start with the JSONObject.parseObject(text, BackBean.class) entry point and the nested BackBean, UserBean, AppBean, and AppInfo classes shown in the report. Reproduce the Android deserialization case with the @JSONField date fields, especially UserBean.authdate and AppBean.enddate. Done means nested objects deserialize their date values correctly on Android.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java
Domain
mobile-dev
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.