2016-12-03 83 views
0

我需要解析Java对象中的Json并保存字段:destination_addresses,origin_addresses和duration。我无法获得“持续时间”的值。这就是我要解析的JSON:从DistanceMatrix Google Api解析嵌套数组Json到Java,使用GSON

{ 
    "destination_addresses" : [ "Blocco Palma Primo, 95121 Fattoria Sole Delfino CT, Italia" ], 
    "origin_addresses" : [ 
     "Unnamed Road, 95121 Catania CT, Italia", 
     "Blocco Palma Primo, 95121 Fattoria Sole Delfino CT, Italia", 
     "Contrada Torre Allegra, 95121 Catania CT, Italia", 
     "Contrada Pantano d'Arci, Catania CT, Italia", 
     "Unnamed Road, 95121 Catania CT, Italia", 
     "Via Cassia, 95121 Catania CT, Italia", 
     "Contrada Pantano d'Arci, Catania CT, Italia", 
     "Contrada Pantano d'Arci, Catania CT, Italia", 
     "Contrada Pantano d'Arci, Catania CT, Italia", 
     "Contrada Pantano d'Arci, Catania CT, Italia" 
    ], 
    "rows" : [ 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "2,0 km", 
        "value" : 2037 
       }, 
       "duration" : { 
        "text" : "4 min", 
        "value" : 266 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "1 m", 
        "value" : 0 
       }, 
       "duration" : { 
        "text" : "1 min", 
        "value" : 0 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "3,8 km", 
        "value" : 3768 
       }, 
       "duration" : { 
        "text" : "7 min", 
        "value" : 400 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "5,3 km", 
        "value" : 5304 
       }, 
       "duration" : { 
        "text" : "6 min", 
        "value" : 374 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "8,2 km", 
        "value" : 8239 
       }, 
       "duration" : { 
        "text" : "13 min", 
        "value" : 785 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "11,5 km", 
        "value" : 11486 
       }, 
       "duration" : { 
        "text" : "15 min", 
        "value" : 901 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "12,2 km", 
        "value" : 12226 
       }, 
       "duration" : { 
        "text" : "18 min", 
        "value" : 1099 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "12,2 km", 
        "value" : 12226 
       }, 
       "duration" : { 
        "text" : "18 min", 
        "value" : 1099 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "12,2 km", 
        "value" : 12226 
       }, 
       "duration" : { 
        "text" : "18 min", 
        "value" : 1099 
       }, 
       "status" : "OK" 
      } 
     ] 
     }, 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "12,2 km", 
        "value" : 12226 
       }, 
       "duration" : { 
        "text" : "18 min", 
        "value" : 1099 
       }, 
       "status" : "OK" 
      } 
     ] 
     } 
    ], 
    "status" : "OK" 
} 

而这正是我试图在Java中,得到我需要的字段:

public static void main(String[] args) throws Exception { 
     // TODO code application logic here 
     URL url = new URL(myUrl); 
     InputStreamReader reader = new InputStreamReader(url.openStream()); 
     SRD sr = new Gson().fromJson(reader, SRD.class); 

     System.out.println("destination: " + sr.destination_addresses.get(0)); 
     System.out.println("origins: " + sr.origin_addresses.get(2)); 
     System.out.println(sr.rows.get(2).elements.get(0).toString()); 



    } 

这些类:

private class SRD { 
     List<String> destination_addresses; 
     List<String> origin_addresses; 
     List<elements> rows; 

    } 


    private class elements { 
     List<duration> elements; 

    } 

    private class duration { 
     String text; 
     int value; 


     public String toString() { 
      return "duration{" + "text=" + text + ", value=" + value + '}'; 
     } 


    } 

执行此代码我得到以下输出:

destination: Blocco Palma Primo, 95121 Fattoria Sole Delfino CT, Italy

origins: Contrada Torre Allegra, 95121 Catania CT, Italy

duration{text=null, value=0}

显然,我可以成功地解析字段destination_addresses和origin_addresses,但不是持续时间,其中给我值0和null。我错在哪里?我怎样才能解决这个问题,并获得持续时间的正确值(文本和值)?感谢您的帮助。

+0

问题是“元素”是一个字段持续时间(某些对象文本/值)的对象而不是持续时间列表。 http://www.jsonschema2pojo.org/可能会帮助你 – 2016-12-03 12:49:00

+0

如果我用“持续时间”替换我的班级“元素”的内容;和'System.out.println(sr.rows.get(2).duration.toString())'的main中的println;'' ,执行失败,错误:线程“main”中的_Exception java.lang.NullPointerException \t at proveJson.SingleRouteParse.main(SingleRouteParse.java:35)_。我按照Netbeans的提示写这个println。 – Ennio

+0

因为在json中我使用了一个列表之前,元素后面跟着方括号[ – Ennio

回答

0

这里,在java类名称应该以大写字母开头。

如果是访问对象的问题,只需定义getter方法。

我没有做出独立的持续时间和距离对象类,因为它们都具有相同的类型和名称属性。

private class SRD { 
    List<String> destination_addresses; 
    List<String> origin_addresses; 
    List<Row> rows; 

} 

private class Row{ 
    List<Element> elements; 

} 


private class Element { 
    General duration; 
    General distance; 
    String status; 

} 

private class General { 
    String text; 
    int value; 


    public String toString() { 
     return "duration{" + "text=" + text + ", value=" + value + '}'; 
    } 


} 
+0

谢谢你,我已经解决了我的问题。我以类似于你关于你的方式修改课程,但没有奏效。现在我会试着去理解为什么,但同时我解答了你的问题。 – Ennio

+0

不用客气 – mismanc

+0

顺便问一下这是什么问题? – mismanc