使用 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.expandresponse.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 反序列化为嵌套的自定义地图?

使用 gson 反序列化 json 字符串

Gson 在反序列化对象时忽略 null

Gson解析(序列化,反序列化)

如何反序列化包含 GSON 库生成的 LocalDate 字段的 JSON

Android 中使用Gson完成对象的序列化与反序列化