使用可选字段

时间:2017-03-17 01:13:56

标签: android json parsing field optional

我正在尝试在android studio中解析一个包含这个内容的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");
......

}

但我不知道如何检查它是一个元素位置或jsonArray“图像”......

3 个答案:

答案 0 :(得分:3)

处理JSON中的可选字段的最佳方法是使用opt代替get

opt提供已解析的值(如果存在)或该数据类型的默认值(如果请求的密钥不存在)。

最好的是,它甚至不需要try catch块,因为它总是返回一个值,如果服务器出现任何错误,它将不会让你的应用程序崩溃或阻止其他值被解析。

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

如果位置存在于响应中,则它将使用该值初始化,否则它将使字符串为null。如果是int或long,则默认值为0,如果布尔值为default,则为false。阅读有关选择更多细节的信息。

答案 1 :(得分: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
        }

            .....
    }

答案 2 :(得分:0)

你应该使用Retrofit和Google Gson,你不需要做很多工作, 他们会为你做这份工作。 看看这些

https://guides.codepath.com/android/Consuming-APIs-with-Retrofit

http://www.vogella.com/tutorials/Retrofit/article.html