将带有嵌套值的JSON转换为POJO

3
所以我有这样的JSON响应:
"data": [
    {
        "id": 11881,
        "date": "2018-03-26T16:22:08",
        "date_gmt": "2018-03-26T14:22:08",
        "guid": {
            "rendered": "http://google.com"
        },
        "modified": "2018-03-26T16:22:08",
        "modified_gmt": "2018-03-26T14:22:08",
        "slug": "some text",
        "status": "some status",
        "type": "post",
        "link": "http://google.com",
        "title": {
            "rendered": "some title"
        }
}
]

如果我有这样的类,我该如何将响应解析为POJO类:

public class Response{
    private List<Post> data;
}

public class Post{
    private String id;
    private String date;
    private String date_gmt;
    private String guid;
}

问题是它有像guid和title这样的嵌套值,我如何将其解析为一个POJO类,而不需要为每个嵌套值创建pojo?


怎么做?你能给我展示一些例子,说明如何使用GSON来实现这个吗? - LeTadas
1
你的 JSON 不合法,请检查一下 https://jsonlint.com/。 - Vidhi Dave
3
使用http://www.jsonschema2pojo.org/生成POJO类。 - Vidhi Dave
1
你的帖子解释了如何解析JSON数据,这对我来说很清楚,但我需要弄清楚如何解析嵌套的JSON数据。 - LeTadas
1
@VishvaDave 我不是JSON专家,但我相信JSON没问题。如果我把它放在花括号里面,你链接的验证器会说“有效的JSON”。 - Ole V.V.
显示剩余4条评论
3个回答

6
您可以按照下面的说明创建Pojo.class
public class pojo {


private Title title;
private String link;
private String type;
private String status;
private String slug;
private String modified_gmt;
private String modified;
private Guid guid;
private String date_gmt;
private String date;
private int id;

public Title getTitle() {
    return title;
}

public void setTitle(Title title) {
    this.title = title;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getSlug() {
    return slug;
}

public void setSlug(String slug) {
    this.slug = slug;
}

public String getModified_gmt() {
    return modified_gmt;
}

public void setModified_gmt(String modified_gmt) {
    this.modified_gmt = modified_gmt;
}

public String getModified() {
    return modified;
}

public void setModified(String modified) {
    this.modified = modified;
}

public Guid getGuid() {
    return guid;
}

public void setGuid(Guid guid) {
    this.guid = guid;
}

public String getDate_gmt() {
    return date_gmt;
}

public void setDate_gmt(String date_gmt) {
    this.date_gmt = date_gmt;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public static class Title {
    private String rendered;

    public String getRendered() {
        return rendered;
    }

    public void setRendered(String rendered) {
        this.rendered = rendered;
    }
}

public static class Guid {
    private String rendered;

    public String getRendered() {
        return rendered;
    }

    public void setRendered(String rendered) {
        this.rendered = rendered;
    }
}
 }

而且你可以解析列表。
 try {
        JSONObject jsonObject = new JSONObject("YOUR_RESPOSE");
        JSONArray data = jsonObject.getJSONArray("data");
        Type listType = new TypeToken<ArrayList<pojo>>() {
        }.getType();
        ArrayList<pojo>  list =new Gson().fromJson(data.toString(), listType);

    } catch (JSONException e) {
        e.printStackTrace();
    }

我为我的嵌套JSON数据创建了多个POJO类,但是返回了空值。使用内部类来保存嵌套的JSON数据的方法对我很有帮助。然而,我使用了以下函数将JSON数据反序列化为Java对象:gson.fromJson(response.getBody().asString(), ABC.class); - Amit

0

创建一个带有构造函数的类

public class Post{

private String id;
private String date;
private String date_gmt;
private String guid;

public Post(String id, String date, String date_gmt, String guid) 
{
    this.id = id;
    this.date = date;
    this.date_gmt = date_gmt;
    this.guid = guid;
}

创建解析逻辑

JSONArray json = new JSONArray(response.body().string());

String id;
String date;
String date_gmt;
JSONObject guid;
String rendered;

JSONObject resultObject = json.getJSONObject(0);

id = resultObject.getString("id");
date = resultObject.getString("date");
date_gmt = resultObject.getString("date_gmt");
guid = resultObject.getJSONObject("guid");                                
rendered = guid.getString("rendered");

Post post = new Post(id, date, date_gmt, rendered);

0
                    **use jackson to parse json to java**

                     <dependency>
                        <groupId>com.fasterxml.jackson.core</groupId>
                        <artifactId>jackson-databind</artifactId>
                           <version>2.7.4</version>
                    </dependency>

                **creat Post.java** 
        **By using map you don't need to create separate pojo classes**
                package parser;

                import java.util.Date;
                import java.util.Map;

                public class Post {
                    private int id;
                    private Date date;
                    private Date date_gmt;
                    private Map<String, String> guid;
                    private Map<String, String> title;
                    private Date modified;
                    private Date modified_gmt;
                    private String slug;
                    private String status;
                    private String type;
                    private String link;
                    /*Getter and Setter Methods*/
                    public int getId() {
                        return id;
                    }
                    public void setId(int id) {
                        this.id = id;
                    }
                    public String getType() {
                        return type;
                    }
                    public void setType(String type) {
                        this.type = type;
                    }
                    public String getLink() {
                        return link;
                    }
                    public void setLink(String link) {
                        this.link = link;
                    }

                    public String getSlug() {
                        return slug;
                    }
                    public void setSlug(String slug) {
                        this.slug = slug;
                    }
                    public String getStatus() {
                        return status;
                    }
                    public void setStatus(String status) {
                        this.status = status;
                    }

                    public Date getModified() {
                        return modified;
                    }
                    public void setModified(Date modified) {
                        this.modified = modified;
                    }
                    public Date getModified_gmt() {
                        return modified_gmt;
                    }
                    public void setModified_gmt(Date modified_gmt) {
                        this.modified_gmt = modified_gmt;
                    }
                    public Date getDate() {
                        return date;
                    }
                    public void setDate(Date date) {
                        this.date = date;
                    }
                    public Date getDate_gmt() {
                        return date_gmt;
                    }
                    public void setDate_gmt(Date date_gmt) {
                        this.date_gmt = date_gmt;
                    }

                    public Map<String, String> getGuid() {
                        return guid;
                    }
                    public void setGuid(Map<String, String> guid) {
                        this.guid = guid;
                    }
                    public Map<String, String> getTitle() {
                        return title;
                    }
                    public void setTitle(Map<String, String> title) {
                        this.title = title;
                    }
                    @Override
                    public String toString() {
                        StringBuilder sb = new StringBuilder();
                        sb.append("\n-----Post Information-----\n");
                        sb.append("Date Gmt: " + getDate_gmt() + "\n");
                        sb.append("Date: " + getDate() + "\n");
                        sb.append("Modified Gmt: " + getModified_gmt() + "\n");
                        sb.append("Status: " + getStatus() + "\n");
                        sb.append("ID: " + getId() + "\n");
                        sb.append("Guid: " + getGuid() + "\n");
                        sb.append("Title:" + getTitle() + "\n");
                        sb.append("Slug: " + getSlug() + "\n");
                        sb.append("Type: " + getType() + "\n");
                        sb.append("*****************************");
                        return sb.toString();
                    }
                }  

            Then create Main class and i am reading json data  from file
            My file Json data as input-:
{
        "id": 11881,
        "date": "2018-03-26T16:22:08",
        "date_gmt": "2018-03-26T14:22:08",
        "guid": {
            "rendered": "http://google.com"
        },
        "modified": "2018-03-26T16:22:08",
        "modified_gmt": "2018-03-26T14:22:08",
        "slug": "some text",
        "status": "some status",
        "type": "post",
        "link": "http://google.com",
        "title": {
            "rendered": "some title"
        }
}


            package parser;

            import java.io.File;
            import java.io.IOException;

            import com.fasterxml.jackson.core.JsonParseException;
            import com.fasterxml.jackson.databind.JsonMappingException;
            import com.fasterxml.jackson.databind.ObjectMapper;

            public class JsonParser {
            public static void main(String[] args) {
                ObjectMapper objectMapper=new ObjectMapper();
                 try {
                     Post emp = objectMapper.readValue(new File("Q://employee.json"), Post.class);
                    System.out.println(emp.toString());
                } catch (JsonParseException e) {
                    e.printStackTrace();
                } catch (JsonMappingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            }

    ---------------output--------------------------
    -----Post Information-----
    Date Gmt: Mon Mar 26 19:52:08 IST 2018
    Date: Mon Mar 26 21:52:08 IST 2018
    Modified Gmt: Mon Mar 26 19:52:08 IST 2018
    Status: some status
    ID: 11881
    Guid: {rendered=http://google.com}
    Title:{rendered=some title}
    Slug: some text
    Type: post
    *****************************

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接