【问题标题】:Deserialize a complex Json Object using GSON in Java在 Java 中使用 GSON 反序列化复杂的 Json 对象
【发布时间】:2016-03-25 02:09:56
【问题描述】:

使用它作为参考,我已经描述了我的 Json 数据的结构,并且可以根据需要获取信息,直到我得到嵌套记录和数组。 Parsing a complex Json Object using GSON in Java

但是,我的 JSON 数据嵌套了多次。例如;

{
  "meetings": [
    {
      "meetingName": "GaryVon",
      "location": "USA",
      "meetingType": "P",
      "meetingDate": "2016-03-25",
      "weatherCondition": "FINE",
      "showCode": {
        "meetingCode": "A",
        "scheduledType": "R"
      },
      "venueType": "ANI",
      "showPools": [
        {
          "showProduct": "GaryVon",
          "showStatus": "Open",

        }
      ]
    }
  ]
}

我有我的包装器和描述 json 数据格式的类。每个类都在一个新的 java 文件中。

public class meetingContainer { 
    public List<meetings> meetings;
}

顶级课程

public class meetings { 
   private String meetingName;
   private String location;
   private String meetingType;
   private String meetingDate;
   private String weatherCondition;
   private ShowCode showCode;
   private String venueType;
   private ShowPools[] showPools;

   public String getMeetingName() { return meetingName; }
   public String getLocation() { return location; }
   public String getMeetingType() { return meetingType; }
   public String getMeetingDate() { return meetingDate; }
   public String getWeatherCondition() { return weatherCondition; }
   public ShowCode getShowCode() { return showCode; }
   public String getVenueType() { return venueType; }
   public ShowPools[] getShowPools() { return showPools; }
}

二级课程

public class ShowCode {
   private String meetingCode;
   private String scheduledType;

   public String getMeetingCode() { return meetingCode; }
   public String getScheduledType() { return scheduledType; }
}

二级课程

public class ShowPools {
   private String showProduct;
   private String showStatus;

   public String getShowProduct() { return showProduct; }
   public String getShowStatus() { return showStatus; }
}

然后我尝试解析它并获取可以正常工作的数据,直到我进入嵌套数组/记录

Gson g = new Gson();
meetingContainer mc = g.fromJson(jsonMeetingsString, meetingContainer.class);
for(meetings m: mc.meetings){
    System.out.println(m.getMeetingName()); //Result = "GaryVon"
    System.out.println(m.getLocation()); //Result = "USA"
    System.out.println(m.getmeetingType()); //Result = "P"
    System.out.println(m.getShowCode());  //Result = "packagename.ShowCode@210366b4"          
}

我的问题是如何声明嵌套数组/记录,然后从不同的类调用这些方法,即调用 showcode 和 showpools 中的方法。另一个帖子没有说如何。对不起,如果这是一个简单的答案,因为我是 java 新手。

【问题讨论】:

  • 我不明白你的问题,我觉得每件事都很好。你想做什么?
  • 我希望能够获取所有值并将它们最终存储在数据库中。我可以使用 m.getMeetingName() 来获取会议名称,但是我无法获取 ShowCodes(meetingCodes、scheduledTypes)。如果我尝试使用 m.getShowCode(),它会返回类似 packagename.ShowCode@210366b4 的结果
  • 它返回一个 ShowCode 实例,ShowCode 没有 toString 方法,这就是为什么你会看到这个奇怪的字符串。试试 m.getShowCode().getMeetingCode()
  • 哇,谢谢。哈哈,很简单,而且很有效。我还在学习 java 并尝试过 m.getShowCode.getMeetingCode() ,但由于失败了,我想也许我无法从我的主课中调用它。
  • 我是否正确声明了 showPools?当我使用m.getExoticPools().getshowProduct() 时出现错误 'Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: ' Is private ShowPools[] showPools; 错误数据类型?

标签: java json gson deserialization


【解决方案1】:
m.getShowCode()

这会返回一个 ShowCode 类型的引用,使用 getter 访问内部值,例如:

m.getShowCode().getMeetingCode()

你应该为 showPools 使用一个列表

private List<ShowPools> showPools;

【讨论】:

  • 我尝试使用 private List&lt;ShowPools&gt; showPools; 。它接受它作为一个有效的数据类型但是当我使用这个方法m.getShowCode().getShowProduct() 它不识别该方法并留下错误 Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type:
【解决方案2】:

您提供的 JSON 字符串无效。它有一个额外的, -

        {
          "showProduct": "GaryVon",
          "showStatus": "Open",
                              ^

回答您在评论中提出的问题:m.getShowCode().getShowProduct() 无效,因为 showCode 节点只有两个属性 meetingCodescheduledType

下面的代码列出了 JSON 的所有值。如果它不涵盖您的问题,请告诉我

    Gson g = new Gson();
    meetingContainer mc = g.fromJson(jsonMeetingsString,
            meetingContainer.class);
    for (meetings m : mc.meetings) {
        System.out.println("meetingName: " + m.getMeetingName()); 
        System.out.println("location: "+ m.getLocation()); 
        System.out.println("meetingType: "+ m.getMeetingType()); 
        System.out.println("meetingDate: "+ m.getMeetingDate()); 
        System.out.println("weatherConditio: "+ m.getWeatherCondition()); 
        System.out.println("showCode->meetingCode: "+ m.getShowCode().getMeetingCode()); 
        System.out.println("showCode->scheduledType: "+ m.getShowCode().getScheduledType());
        System.out.println("venueType: "+ m.getVenueType()); 
        for(ShowPools showPool : m.getShowPools()){
            System.out.println("showPools->showProduct: "+ showPool.getShowProduct());
            System.out.println("showPools->showStatus: "+ showPool.getShowStatus());
        }
    }

输出:

meetingName: GaryVon
location: USA
meetingType: P
meetingDate: 2016-03-25
weatherConditio: FINE
showCode->meetingCode: A
showCode->scheduledType: R
venueType: ANI
showPools->showProduct: GaryVon
showPools->showStatus: Open

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多