2017-03-17 187 views
1

我想在Android Studio中解析一個JSON,那containts這樣:JSON解析與可選字段

"stops": 
[ 
    { 
     "num": 1, 
     "time": "2016-04-27T06:15:00.000Z", 
     "title":"Flight to London", 
     "desc":"Barcelona BCN-London-Gatwick LGW", 
     "type":"0", 
     "subtype":0 
    }, 
    { 
     "num": 2, 
     "time": "2016-04-27T10:35:00.000Z", 
     "title":"Gatwick express", 
     "desc":"From Airport to London", 
     "type":"0", 
     "subtype":1 
    }, 
    { 
     "num": 3, 
     "time": "2016-04-27T12:15:00.000Z", 
     "title":"Pub the black horse", 
     "desc":"From Airport to London", 
     "type":1, 
     "subtype":1, 
     "location": "51.476334, -0.062700", 
     "images": [     "https://fitzrovianews.files.wordpress.com/2011/01/black_horse_rathbone_pl.jpg" 
     ]    
    }, 
    { 
     "num": 4, 
     "time": "2016-04-27T12:16:47.000Z", 
     "title":"The Tower Bridge", 
     "desc":"# The Tower Bridge Facts\n## Architecture\n**Tower Bridge** is a combined bascule and suspension bridge in London built in _1886–1894_. The bridge crosses the River Thames close to the Tower of London and has become an iconic symbol of London. Tower Bridge is one of five London bridges now owned and maintained by the Bridge House Estates, a charitable trust overseen by the City of London Corporation. \n>It is the only one of the Trust's bridges not to connect the City of London directly to the Southwark bank, as its northern landfall is in Tower Hamlets.\n## The bridge Exhibition\nThis must-see London attraction invites you to step inside the most famous bridge in the world to explore its iconic structure, spectacular views and glass floor, modern exhibitions and magnificent Victorian Engine Rooms! ", 
     "type":1, 
     "subtype":6, 
     "location": "51.507792, -0.087786", 
     "images": [     
"https://i.ytimg.com/vi/nby0Mr2LfBQ/hqdefault.jpg", 
"http://raindropsofsapphire.com/wp-content/uploads/2011/10/london-bridge.jpg", 
"http://www.londonforfree.net/gizmo/wp-content/uploads/2015/02/southwark-bridge.jpg" 
     ]    
    }, 
    { 
     "num": 5, 
     "time": "2016-04-27T12:18:10.000Z", 
     "title":"St. Paul Cathedral", 
     "desc":"# HISTORY \nSt **Paul's Cathedral**, London, is an _Anglican cathedral_, the seat of the _Bishop of London_ and the mother church of the Diocese of London. \n * It sits on Ludgate Hill at the highest point of the City of London and is a Grade 1 listed building. \n * Its dedication to Paul the Apostle dates back to the original church on this site, founded in AD 604.", 
     "type":1, 
     "subtype":6, 
     "location": "51.513825, -0.098351", 
     "images": [     
"https://d1wgio6yfhqlw1.cloudfront.net/sysimages/product/resized6/Interior_St_Pauls_Cathedral_132_12992.jpg", 
"https://d1kioxk2jrdjp.cloudfront.net/resized/486x324/48-st_pauls_ctahedral_millenirm_bridge.jpg", 
"http://i4.mirror.co.uk/incoming/article8299330.ece/ALTERNATES/s615b/LOND-2016-052-HMQ-St-Pauls-Thanks-Giving-704JPG.jpg" 
     ]    
    } 
] 

的問題是,我不知道如何處理領域的「位置」或「圖像」是可選的。我知道如何處理的第一個「停」,我這樣做:

JSONArray stops = jsonObj.getJSONArray("stops"); 

     for (int i = 0; i < stops.length(); i++) { 
      JSONObject c = stops.getJSONObject(i); 

      String num = c.getString("num"); 
      String time = c.getString("time"); 
      String title = c.getString("title"); 
      String descripcion = c.getString("desc"); 
      String type = c.getString("type"); 
      String subtype = c.getString("subtype"); 
...... 

} 

但我不知道如何點擊此處查看是elment位置或jsonArray「圖像」 ...

回答

1

最好的方式來處理JSON可選字段是使用opt,而不是get

選擇提供了分析的價值,如果存在或默認值對於數據類型如果請求的密鑰不存在。

最好的事情是,它甚至不需要try catch塊,因爲它總是返回一個值,並且在服務器出現任何錯誤的情況下,它不會讓你的應用崩潰或阻止其他值被解析。

String location = response.optString("location"); 

如果在響應中存在位置,則它將使用該值進行初始化,否則將保留字符串null。在int或long的情況下,默認爲0,如果布爾默認爲false。閱讀關於選擇更多細節。

2

使用has()方法

JSONArray stops = jsonObj.getJSONArray("stops"); 

    for (int i = 0; i < stops.length(); i++) { 
     JSONObject c = stops.getJSONObject(i); 

     String num = c.getString("num"); 
     String time = c.getString("time"); 
     String title = c.getString("title"); 
     String descripcion = c.getString("desc"); 
     String type = c.getString("type"); 
     String subtype = c.getString("subtype"); 
     if(c.has("location") && !c.isNull("location")){ 
      // parse location 
     } 

     if(c.has("images") && !c.isNull("images")){ 
      // parse images 
     } 

      ..... 
    } 
+0

太棒了!首先檢查然後初始化。爲什麼不使用optString或optInt或optJson等? –

+0

@MohammedAtif他們都是很好的方法來實現所需要的,但事情是我只是使用'optString',例如,當我想要獲取鍵的值(如果鍵存在)或默認值,空字符串,(如果鍵不存在),但當然你可以在這裏使用它來知道鍵是否存在! –

+0

在這裏我不認爲任務涉及檢查密鑰的存在。在這裏他想要處理它。 –