java - 使用 GSON 解析多层嵌套 json

标签 java json gson

我必须将 json 文件解析为文本文件,示例 json 文件如下,

{
  "link":"https://xxx.nt",
  "liveChannels":[
                      {
                          "name":"Sony TV",
                          "id":1004,
                          "link":"https://xxx.nt",
                          "decryptionTicket":"https://xxxy.nt",
                          "viewLevel":"Too High",
                              "programs":
                                  {
                                  "totalItems":1,
                                  "programs":[
                                                  {
                                                      "name":"Live or die",
                                                      "id":1000000000,
                                                      "catchUp":["FUN"],
                                                      "startOver":["Again"]
                                                  }
                                              ]
                              }
                  }
              ]
}

我通过创建以下 java 类使用 GSON 来解析文件。

  1. channel
  2. 直播 channel
  3. 程序
  4. 子程序

channel .java

public class channel 
{

    String link = null;
    ArrayList<liveChannels> liveChannels;

    public String getLink() {
        return link;
    }

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

    public ArrayList<liveChannels> getliveChannels() {
        return liveChannels;
    }

    public void setliveChannels(ArrayList<liveChannels> liveChannels) {
        this.liveChannels = liveChannels;
    }

}

livechannel.java

public class liveChannels {

    String name = null;
    int id;
    String link = null;
    String decryptionTicket = null;
    String viewLevel = null;


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

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

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

    public String getLink() {
        return link;
    }

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

    public String getDecryptionTicket() {
        return decryptionTicket;
    }

    public void setDecryptionTicket(String decryptionTicket) {
        this.decryptionTicket = decryptionTicket;
    }

    public String getViewLevel() {
        return viewLevel;
    }

    public void setViewLevel(String viewLevel) {
        this.viewLevel = viewLevel;
    }

}

之后如何解析程序中的逻辑。

"programs": { "totalItems":1,

程序.java

public class programs {

    ArrayList<sub_programs> sub_programs;

    int totalItems;

    public int getTotalItems() {
        return totalItems;
    }

    public void setTotalItems(int totalItems) {
        this.totalItems = totalItems;
    }

    public ArrayList<sub_programs> getProgramsDetails() {
        return sub_programs;
    }

    public void setProgramsDetails(ArrayList<sub_programs> sub_programs) {
        this.sub_programs = sub_programs;
    }

}

子程序.java

public class sub_programs {

    String name = null;
    int id;
    String catchUp = null;
    String startOver = null;


    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

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

    public String getCatchUp() {
        return catchUp;
    }

    public void setCatchUp(String catchUp) {
        this.catchUp = catchUp;
    }

    public String getStartOver() {
        return startOver;
    }

    public void setStartOver(String startOver) {
        this.startOver = startOver;
    }

}

主要如下所示,

    public static void main(String[] args) throws IOException 
    {

        Gson gson = new Gson();

        String contents = FileUtils.readFileToString(
                new File("C:/sample.json"), "UTF-8");

        channel channelHeader = gson.fromJson(contents, channel.class);

        System.out.println("Channel Information --->");

        System.out.println("Channel Link: " + channelHeader.getLink());

        ArrayList<liveChannels> liveChannels = channelHeader.getliveChannels();

        for (int i = 0; i < liveChannels.size(); i++) {
            System.out.println("liveChannels Detail --->");
            liveChannels liveChannelsDetail = liveChannels.get(i);
            System.out.println("Channel Name : " + liveChannelsDetail.getName());
            System.out.println("Channel ID : " + liveChannelsDetail.getId());
            System.out.println("Channel Description Ticket: " + liveChannelsDetail.getDecryptionTicket());
            System.out.println("Channel View Level : " + liveChannelsDetail.getViewLevel());
        }

    }

}

有人可以帮忙获取从 livechannel 类开始解析程序的逻辑吗?

由于程序不是数组列表,还有什么其他方法可以获取值。

最佳答案

您的 liveChannels 类中缺少 programs 对象。

public class liveChannels {

    String name = null;
    int id;
    String link = null;
    String decryptionTicket = null;
    String viewLevel = null;
    programs programs;

    public void setPrograms (programs programs) {
        this.programs = programs;
    }

    public programs getPrograms() {
        return programs;
    }

    ...
}

然后在您的 programs 类中,您需要将 sub_programs 字段重命名为 programs

public class programs {

    ArrayList<sub_programs> programs;

    ...
}

顺便说一句,您的类命名不遵循 Java 标准,被认为是不好的做法。您的类应该这样命名:

Channel
LiveChannel
Program
SubProgram

请注意,这不会影响 GSON 解析文档的能力,因为 GSON 更关心属性名称而不是字段的实际类名称。

关于java - 使用 GSON 解析多层嵌套 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40998759/

相关文章:

java - 如何从 JSON 字符串创建 JAVA 对象?

ios - 将 JSON 数组字符串转换为 JSON 数组返回 null

java - 不使用 pojo 、 bean 或 getter 和 setter 获取 Json 标题为 json 数组

java - 忽略代码覆盖率中的类和方法 (jacoco)

java - 如何使用 Java 从解析查询中检索数组?

java - Jackson 序列化/反序列化 : Dynamic properties and fields

java - Json将String中的&转换为\u0026

java - 使用 GSON 将 java.time.LocalDateTime (java 8) 序列化为 js Date 的最佳实践

java - 为每个循环设置值

java - Scala中获取Json头节点值