使用GSON反序列化嵌套的JSON字符串

全部,我有以下JSON输出/字符串(它是来自JIRA API的响应):

 { "expand": "names,schema", "startAt": 0, "maxResults": 50, "total": 1, "issues": [ { "expand": "operations,versionedRepresentations,editmeta,changelog,transitions,renderedFields", "id": "18200", "self": "https://localhost/rest/api/2/issue/18200", "key": "LS-1111", "fields": { "issuetype": { "self": "https://localhost/rest/api/2/issuetype/3", "id": "3", "description": "A task that needs to be done.", "iconUrl": "https://localhost/secure/viewavatar?size=xsmall&avatarId=10318&avatarType=issuetype", "name": "Task", "subtask": false, "avatarId": 10318 }, "timespent": 21600, "aggregatetimespent": 25200, "resolution": null, "customfield_11201": null, "project": { "self": "https://localhost/rest/api/2/project/10100", "id": "10100", "key": "PROJKEY", "name": "ProjectABCD", "avatarUrls": { "48x48": "https://localhost/secure/projectavatar?pid=10100&avatarId=10600", "24x24": "https://localhost/secure/projectavatar?size=small&pid=10100&avatarId=10600", "16x16": "https://localhost/secure/projectavatar?size=xsmall&pid=10100&avatarId=10600", "32x32": "https://localhost/secure/projectavatar?size=medium&pid=10100&avatarId=10600" } }, "issuelinks": [ { "id": "16202", "self": "https://localhost/rest/api/2/issueLink/16202", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to", "self": "https://localhost/rest/api/2/issueLinkType/10003" } } ] } } ] } 

我正在使用GSON遍历元素并获取值。 我在“嵌套对象”示例后写了POJO

http://www.javacreed.com/gson-deserialiser-example/

我能够将元素值提升到第二级。 例如:我能够获得response.expandresponse.issues.get(0).expand和其他值的值,直到此级别。 如何获取response.issues.get(0).fields.issuetype.id的值?

我应该如何构建我的反序列化器和POJO类。 请协助。 谢谢。

尝试这个 –

AvatarUrls.java

 public class AvatarUrls { private String _48x48; private String _24x24; private String _16x16; private String _32x32; public String get_48x48() { return _48x48; } public void set_48x48(String _48x48) { this._48x48 = _48x48; } public String get_24x24() { return _24x24; } public void set_24x24(String _24x24) { this._24x24 = _24x24; } public String get_16x16() { return _16x16; } public void set_16x16(String _16x16) { this._16x16 = _16x16; } public String get_32x32() { return _32x32; } public void set_32x32(String _32x32) { this._32x32 = _32x32; } @Override public String toString() { return "AvatarUrls [_48x48=" + _48x48 + ", _24x24=" + _24x24 + ", _16x16=" + _16x16 + ", _32x32=" + _32x32 + "]"; } } 

Example.java

 import java.util.ArrayList; import java.util.List; public class Example { private String expand; private Integer startAt; private Integer maxResults; private Integer total; private List issues = new ArrayList(); public String getExpand() { return expand; } public void setExpand(String expand) { this.expand = expand; } public Integer getStartAt() { return startAt; } public void setStartAt(Integer startAt) { this.startAt = startAt; } public Integer getMaxResults() { return maxResults; } public void setMaxResults(Integer maxResults) { this.maxResults = maxResults; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } public List getIssues() { return issues; } public void setIssues(List issues) { this.issues = issues; } @Override public String toString() { return "Example [expand=" + expand + ", startAt=" + startAt + ", maxResults=" + maxResults + ", total=" + total + ", issues=" + issues + "]"; } } 

Fields.java

 import java.util.ArrayList; import java.util.List; public class Fields { private Issuetype issuetype; private Integer timespent; private Integer aggregatetimespent; private Object resolution; private Object customfield11201; private Project project; private List issuelinks = new ArrayList(); public Issuetype getIssuetype() { return issuetype; } public void setIssuetype(Issuetype issuetype) { this.issuetype = issuetype; } public Integer getTimespent() { return timespent; } public void setTimespent(Integer timespent) { this.timespent = timespent; } public Integer getAggregatetimespent() { return aggregatetimespent; } public void setAggregatetimespent(Integer aggregatetimespent) { this.aggregatetimespent = aggregatetimespent; } public Object getResolution() { return resolution; } public void setResolution(Object resolution) { this.resolution = resolution; } public Object getCustomfield11201() { return customfield11201; } public void setCustomfield11201(Object customfield11201) { this.customfield11201 = customfield11201; } public Project getProject() { return project; } public void setProject(Project project) { this.project = project; } public List getIssuelinks() { return issuelinks; } public void setIssuelinks(List issuelinks) { this.issuelinks = issuelinks; } @Override public String toString() { return "Fields [issuetype=" + issuetype + ", timespent=" + timespent + ", aggregatetimespent=" + aggregatetimespent + ", resolution=" + resolution + ", customfield11201=" + customfield11201 + ", project=" + project + ", issuelinks=" + issuelinks + "]"; } } 

Issue.java

 public class Issue { private String expand; private String id; private String self; private String key; private Fields fields; public String getExpand() { return expand; } public void setExpand(String expand) { this.expand = expand; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSelf() { return self; } public void setSelf(String self) { this.self = self; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Fields getFields() { return fields; } public void setFields(Fields fields) { this.fields = fields; } @Override public String toString() { return "Issue [expand=" + expand + ", id=" + id + ", self=" + self + ", key=" + key + ", fields=" + fields + "]"; } } 

Issuelink.java

 public class Issuelink { private String id; private String self; private Type type; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSelf() { return self; } public void setSelf(String self) { this.self = self; } public Type getType() { return type; } public void setType(Type type) { this.type = type; } @Override public String toString() { return "Issuelink [id=" + id + ", self=" + self + ", type=" + type + "]"; } } 

Issuetype.java

 public class Issuetype { private String self; private String id; private String description; private String iconUrl; private String name; private Boolean subtask; private Integer avatarId; public String getSelf() { return self; } public void setSelf(String self) { this.self = self; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getIconUrl() { return iconUrl; } public void setIconUrl(String iconUrl) { this.iconUrl = iconUrl; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getSubtask() { return subtask; } public void setSubtask(Boolean subtask) { this.subtask = subtask; } public Integer getAvatarId() { return avatarId; } public void setAvatarId(Integer avatarId) { this.avatarId = avatarId; } @Override public String toString() { return "Issuetype [self=" + self + ", id=" + id + ", description=" + description + ", iconUrl=" + iconUrl + ", name=" + name + ", subtask=" + subtask + ", avatarId=" + avatarId + "]"; } } 

Project.java

 public class Project { private String self; private String id; private String key; private String name; private AvatarUrls avatarUrls; public String getSelf() { return self; } public void setSelf(String self) { this.self = self; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getName() { return name; } public void setName(String name) { this.name = name; } public AvatarUrls getAvatarUrls() { return avatarUrls; } public void setAvatarUrls(AvatarUrls avatarUrls) { this.avatarUrls = avatarUrls; } @Override public String toString() { return "Project [self=" + self + ", id=" + id + ", key=" + key + ", name=" + name + ", avatarUrls=" + avatarUrls + "]"; } } 

Type.java

 public class Type { private String id; private String name; private String inward; private String outward; private String self; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getInward() { return inward; } public void setInward(String inward) { this.inward = inward; } public String getOutward() { return outward; } public void setOutward(String outward) { this.outward = outward; } public String getSelf() { return self; } public void setSelf(String self) { this.self = self; } @Override public String toString() { return "Type [id=" + id + ", name=" + name + ", inward=" + inward + ", outward=" + outward + ", self=" + self + "]"; } } 

现在你可以测试它 –

Main.java

  import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.testgson.beans.Example; public class Main { private static Gson gson; static { gson = new GsonBuilder().create(); } /** * @param args */ public static void main(String[] args) { String j = "{\"expand\":\"names,schema\",\"startAt\":0,\"maxResults\":50,\"total\":1,\"issues\":[{\"expand\":\"operations,versionedRepresentations,editmeta,changelog,transitions,renderedFields\",\"id\":\"18200\",\"self\":\"https://localhost/rest/api/2/issue/18200\",\"key\":\"LS-1111\",\"fields\":{\"issuetype\":{\"self\":\"https://localhost/rest/api/2/issuetype/3\",\"id\":\"3\",\"description\":\"A task that needs to be done.\",\"iconUrl\":\"https://localhost/secure/viewavatar?size=xsmall&avatarId=10318&avatarType=issuetype\",\"name\":\"Task\",\"subtask\":false,\"avatarId\":10318},\"timespent\":21600,\"aggregatetimespent\":25200,\"resolution\":null,\"customfield_11201\":null,\"project\":{\"self\":\"https://localhost/rest/api/2/project/10100\",\"id\":\"10100\",\"key\":\"PROJKEY\",\"name\":\"ProjectABCD\",\"avatarUrls\":{\"48x48\":\"https://localhost/secure/projectavatar?pid=10100&avatarId=10600\",\"24x24\":\"https://localhost/secure/projectavatar?size=small&pid=10100&avatarId=10600\",\"16x16\":\"https://localhost/secure/projectavatar?size=xsmall&pid=10100&avatarId=10600\",\"32x32\":\"https://localhost/secure/projectavatar?size=medium&pid=10100&avatarId=10600\"}},\"issuelinks\":[{\"id\":\"16202\",\"self\":\"https://localhost/rest/api/2/issueLink/16202\",\"type\":{\"id\":\"10003\",\"name\":\"Relates\",\"inward\":\"relates to\",\"outward\":\"relates to\",\"self\":\"https://localhost/rest/api/2/issueLinkType/10003\"}}]}}]}"; Example r = gson.fromJson(j, Example.class); System.out.println(r); // This is how traversal can be done List issues = r.getIssues(); for(Issue i: issues) { System.out.println("Expand - " + i.getExpand()); System.out.println("Id - " + i.getId()); System.out.println("Self - " + i.getSelf()); System.out.println("Key - " + i.getKey()); System.out.println("Fields - " + i.getFields()); } } } 

结果是 –

 Example [expand=names,schema, startAt=0, maxResults=50, total=1, issues=[Issue [expand=operations,versionedRepresentations,editmeta,changelog,transitions,renderedFields, id=18200, self=https://localhost/rest/api/2/issue/18200, key=LS-1111, fields=Fields [issuetype=Issuetype [self=https://localhost/rest/api/2/issuetype/3, id=3, description=A task that needs to be done., iconUrl=https://localhost/secure/viewavatar?size=xsmall&avatarId=10318&avatarType=issuetype, name=Task, subtask=false, avatarId=10318], timespent=21600, aggregatetimespent=25200, resolution=null, customfield11201=null, project=Project [self=https://localhost/rest/api/2/project/10100, id=10100, key=PROJKEY, name=ProjectABCD, avatarUrls=AvatarUrls [_48x48=null, _24x24=null, _16x16=null, _32x32=null]], issuelinks=[Issuelink [id=16202, self=https://localhost/rest/api/2/issueLink/16202, type=Type [id=10003, name=Relates, inward=relates to, outward=relates to, self=https://localhost/rest/api/2/issueLinkType/10003]]]]]]]