1. ホーム
  2. android

[解決済み] オプションフィールドを含むJSONのパース

2022-02-11 21:18:08

質問

アンドロイドスタジオで、次のような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"
        ]               
    }
] 

問題は、オプションのフィールドである "location" と "images" をどのように処理すればよいのかがわからないことです。最初の"stop"を処理する方法は知っているので、私はこれをやっています。

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の"images"かを確認する方法がわかりません...。

解決方法は?

JSONのオプションフィールドを処理する最善の方法は opt の代わりに get

optは、存在すれば解析された値を、要求されたキーが存在しなければそのデータ型のデフォルト値を提供します。

サーバーから何らかのエラーが発生した場合でも、アプリがクラッシュしたり、他の値がパースされなくなったりすることはありません。

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

intやlongの場合、デフォルトは0、booleanの場合、デフォルトはfalseです。詳細はoptを参照してください。