Parse JSON with optional field

放肆的年华 提交于 2019-12-13 12:22:09

问题


I'm trying to parse in android studio a JSON, that containts this :

"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"
        ]               
    }
] 

The problem is, i don't know how to deal with the field "location" or "images" which are optional. I know how to deal with the first "stop", i'm doing this :

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");
......

}

But i don't know how to check it here is a elment location or a jsonArray "images"...


回答1:


best way to handle optional fields in JSON is to use opt instead of get

opt provides the parsed value if exist or default value for that datatype if requested key does not exist.

best thing is, it don't even need a try catch block since it always returns a value and in case of any error from server, it will not let your app crash or prevent other values from being parsed.

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

if location exist in response, then it will initialize with the value or it will leave the string null. in case of int or long default is 0, in case of boolean default is false. read about opt for more details.




回答2:


Use has() method

    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
        }

            .....
    }



回答3:


you should use Retrofit and Google Gson, where you do not have to do lot of work, they will do the job for you. look at these

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

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



来源:https://stackoverflow.com/questions/42847522/parse-json-with-optional-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!