アンドロイド - JSONを解析する方法

Android上でJSON(JavaScript Object Notation)を解析する方法についてまとめました。 JSONは key-valueのサンドゥルからなる、人が読みやすいデータコードです。

JSONはObject、Array、Key-Valueの形で構成されておりString、Int、Long、Booleanなどの型をサポートします。 JSONの基本的な知識をまず説明し、JSONObjectライブラリにJSONを解析する方法について説明します。

この記事のコードは、鼻間違って作成しました。

JSONについて詳しく知りたい場合は、WIKI-JSONを参照してください。

JSONの基本構成

JSONはObject、Array、Key-Valueの形で構成されておりString、Int、Long、Booleanなどの型をサポートします。

オブジェクト

Object{ }(curly brace)で包まれていることを意味します。例えば、次のJSONコードは、1つのObjectがあり、そのObjectはtitle、url、draft、starという4つのkeyとそれに対応するvalueを持っています。

{
  "title": "how to get stroage size",
  "url": "https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/",
  "draft": false,
  "star": 10
}

Key-Value

Key-Valueは、上記のtitleを例にとると、"title"がkeyであり、:次の"how to get stroage size"がvalueです。 keyは必ず "..."のように、コロンで包まなければします。 valueはString型である場合、 "..."で表現してBooleanやIntegerだけ使えばされます。

"title": "how to get stroage size",

Array

Arrayは、 [ ](square bracket)に包まれていることを意味します。

次のJSONコードでkey "posts"のvalueは、Arrayです。このArrayは、3つのObjectを持っています。( {..}はObjectであるため) Objectは再び3つのkeyと3つのvalueを持っている構造です。

{
  "posts": [
      {
          "title": "how to get stroage size",
          "url": "https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/",
          "draft": false
      },
      {
            "title": "Android Q, Scoped Storage",
            "url": "https://codechacha.com/ja/android-q-scoped-storage/",
            "draft": false
      },
      {
            "title": "How to parse JSON in android",
            "url": "https://codechacha.com/ja/how-to-parse-json-in-android/",
            "draft": true
      }
  ]
}

JSONObjectにJSONの解析する

現在、Androidの基本的に提供するJSONObjectにJSONを解析してみましょう。 3つの他の形態のJSONがあり、これらを解析するためのコードを実装してチュートリアルを進める考えです。

1.簡単なKey-ValueのみのJSON

次のコードでは jsonStringは、私たちが解析するJSONです。 JSONをまず分析してみると、1つのObjectがあり、そのObjectは、4つのkeyとvalueを持っています。 コードを見ると、まず、最上位のObjectを取得し、そのObjectから知っているKey値としてValueをもたらした。

fun jsonKeyValueExample() {
    val jsonString = """
        {
            "title": "how to get stroage size",
            "url": "https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/",
            "draft": false,
            "star": 10
        }
    """.trimIndent()

    val jObject = JSONObject(jsonString)
    val title = jObject.getString("title")
    val url = jObject.getString("url")
    val draft = jObject.getBoolean("draft")
    val star = jObject.getInt("star")
    Log.d(TAG, "title: $title")
    Log.d(TAG, "url: $url")
    Log.d(TAG, "draft: $draft")
    Log.d(TAG, "star: $star")
}

もう少し詳しく説明すると、以下のコードでJSONのトップレベルのObjectを解析することができます。

val jObject: JSONObject = JSONObject(jsonString)

次のコードは、JSONObjectオブジェクトでサブのkey-valueを解析するためのコードです。 keyとタイプを知っている前提の下、Stringは JSONObject.getString()、Booelanは JSONObject.getBoolean()、Intは JSONObject.getInt()でvalueを取得することができます。

val title = jObject.getString("title")
val url = jObject.getString("url")
val draft = jObject.getBoolean("draft")
val star = jObject.getInt("star")

だから、コードの実行結果は、次のとおりです。

title: how to get stroage size
url: https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/
draft: false
star: 10

2.サブ複数ObjectがあるJSON

今回解析するJSONは以下のコードで jsonStringです。最上位Objectは下位にpost1とpost2という二つのObjectを持っている構造です。 コードを見ると、まず、最上位のObjectを解析し、その次のサブの2つのObjectを解析します。そして上記の解析したかのようにkeyとvalueを解析しました。

fun jsonObjectsExample() {
    val jsonString = """
        {
          "post1": {
              "title": "how to get stroage size",
              "url": "https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/",
              "draft": false
          },
          "post2": {
                "title": "Android Q, Scoped Storage",
                "url": "https://codechacha.com/ja/android-q-scoped-storage/",
                "draft": false
          }
        }
    """.trimIndent()

    val jObject = JSONObject(jsonString)
    val post1Object = jObject.getJSONObject("post1")
    Log.d(TAG, post1Object.toString())

    var title = post1Object.getString("title")
    var url = post1Object.getString("url")
    var draft = post1Object.getBoolean("draft")
    Log.d(TAG, "title(post1): $title")
    Log.d(TAG, "url(post1): $url")
    Log.d(TAG, "draft(post1): $draft")

    val post2Object = jObject.getJSONObject("post2")
    Log.d(TAG, post2Object.toString())
    title = post2Object.getString("title")
    url = post2Object.getString("url")
    draft = post2Object.getBoolean("draft")
    Log.d(TAG, "title(post2): $title")
    Log.d(TAG, "url(post2): $url")
    Log.d(TAG, "draft(post2): $draft")
}

もう少し詳しく説明すると次のコードは、最上位のObjectを解析して、 jObject.getJSONObject(key value)でサブObjectを取得しました。

val jObject = JSONObject(jsonString)
val post1Object = jObject.getJSONObject("post1")
Log.d(TAG, post1Object.toString())

post1Objectをログに出力してみると、以下のように内部のすべてのkey-valueが含まれています。

{"title":"how to get stroage size","url":"https:\/\/codechacha.com\/ko\/get-free-and-total-size-of-volumes-in-android\/","draft":false}

次のコードは、post1Objectでkey-valueを解析する部分です。

var title = post1Object.getString("title")
var url = post1Object.getString("url")
var draft = post1Object.getBoolean("draft")

だから、実行結果は次のとおりです。

{"title":"how to get stroage size","url":"https:\/\/codechacha.com\/ko\/get-free-and-total-size-of-volumes-in-android\/","draft":false}
title(post1): how to get stroage size
url(post1): https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/
draft(post1): false
{"title":"Android Q, Scoped Storage","url":"https:\/\/codechacha.com\/ko\/android-q-scoped-storage\/","draft":false}
title(post2): Android Q, Scoped Storage
url(post2): https://codechacha.com/ja/android-q-scoped-storage/
draft(post2): false

3. ArrayがあるJSON

今回解析するJSONは以下のコードで jsonStringです。最上位Objectは1つのArrayを持っています。そのArrayは、3つのObjectを持っています。 次のコードを見れば、Arrayを取得し、for文では、内部のすべてのkey-valueを出力しています。

fun jsonArrayExample() {
    val jsonString = """
        {
          "posts": [
            {
                "title": "how to get stroage size",
                "url": "https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/",
                "draft": false
            },
            {
                  "title": "Android Q, Scoped Storage",
                  "url": "https://codechacha.com/ja/android-q-scoped-storage/",
                  "draft": false
            },
            {
                  "title": "How to parse JSON in android",
                  "url": "https://codechacha.com/ja/how-to-parse-json-in-android/",
                  "draft": true
            }
          ]
        }
    """.trimIndent()

    val jObject = JSONObject(jsonString)
    val jArray = jObject.getJSONArray("posts")

    for (i in 0 until jArray.length()) {
        val obj = jArray.getJSONObject(i)
        val title = obj.getString("title")
        val url = obj.getString("url")
        val draft = obj.getBoolean("draft")
        Log.d(TAG, "title($i): $title")
        Log.d(TAG, "url($i): $url")
        Log.d(TAG, "draft($i): $draft")
    }
}

もう少し詳しく説明すると、 jObject.getJSONArray(key value)は、サブのArrayオブジェクトを返します。

val jObject = JSONObject(jsonString)
val jArray = jObject.getJSONArray("posts")

jArray.length()は、Arrayの長さを返し、この例では、3を返すことになります。 for文を利用して、すべてのオブジェクトを移動しながら、内部のkey-valueを解析しています。

for (i in 0 until jArray.length()) {
    val obj = jArray.getJSONObject(i)
    val title = obj.getString("title")
    val url = obj.getString("url")
    val draft = obj.getBoolean("draft")
}

だから、実行結果は次のとおりです。

title(0): how to get stroage size
url(0): https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/
draft(0): false
title(1): Android Q, Scoped Storage
url(1): https://codechacha.com/ja/android-q-scoped-storage/
draft(1): false
title(2): How to parse JSON in android
url(2): https://codechacha.com/ja/how-to-parse-json-in-android/
draft(2): true

JSONObjectライブラリ

簡単JSONObjectのAPIを整理しました。

  • getJSONArray(String name): 引数として渡されたkeyのArrayをJSONArrayタイプとして戻し
  • getJSONObject(String name): 引数として渡されたkeyのObjectをJSONObjectタイプとして戻し
  • get(String name): 引数として渡されたkeyのオブジェクトをObjectタイプに戻り
  • getString(String name): 引数として渡されたkeyのオブジェクトをString型に戻す
  • getInt(String name): 引数として渡されたkeyのオブジェクトをInt型で返さ
  • getLong(String name): 引数として渡されたkeyのオブジェクトをLong型に戻す
  • getDouble(String name): 引数として渡されたkeyのオブジェクトをDouble型で返す
  • getBoolean(String name): 引数として渡されたkeyのオブジェクトをBoolean型に戻す

まとめ

JSONは何で構成されていることだけを知って見て、3つのJSONケースを解析するためのコードを実装しました。

参考

codechachaCopyright ©2019 codechacha