使用 GSON 反序列化嵌套的 JSON 字符串
Posted
技术标签:
【中文标题】使用 GSON 反序列化嵌套的 JSON 字符串【英文标题】:Deserializing nested JSON string using GSON 【发布时间】:2016-01-05 14:12:48 【问题描述】:所有,
我有以下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.expand
、response.issues.get(0).expand
和其他值直到这个级别。
如何获得response.issues.get(0).fields.issuetype.id
的值?
我应该如何构造我的反序列化器和POJO
类。请协助。谢谢。
【问题讨论】:
【参考方案1】:试试这个 -
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<Issue> issues = new ArrayList<Issue>();
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<Issue> getIssues()
return issues;
public void setIssues(List<Issue> 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<Issuelink> issuelinks = new ArrayList<Issuelink>();
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<Issuelink> getIssuelinks()
return issuelinks;
public void setIssuelinks(List<Issuelink> 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<Issue> 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]]]]]]]
【讨论】:
感谢您的回答。有没有一种特定的方式可以让我获得部分回复。例如:如果我需要获取“example.issues.key”,我该如何获取? 如果您觉得这个答案有帮助,那么请接受这个答案。由于现在一切都在 java 对象中,您可以获取值。 当然,我接受它作为答案。你能帮忙提供样品吗?如何从 Main 类中获取 issues.key 的值?以上是关于使用 GSON 反序列化嵌套的 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 gson 将 json 反序列化为嵌套的自定义地图?