[iOS][Android] ライブラリを使わずに JSON をパースする

2016.06.12

そんなに難しくないよ

以前紹介した XML のパース と同様、JSON のパースも大したことないです。
それでは早速、簡単な JSON をパースしてみましょう。

使用する JSON は こちら
Twitter API を叩いた時のエラーレスポンスです。
(Twitter API は認証が必要なため、エラーレスポンスが返ってきます)

整形したものはこちら。

{
    "errors" : [
        {
            "code" : 215,
            "message" : "Bad Authentication data."
        }
    ]
}

この JSON の構造は以下のとおりです。

  • トップレベルに 辞書 がある
  • その 辞書キー errors の値は 配列 である
  • その 配列 の要素数は 1 である
  • その 配列の要素 は以下のキーをもつ 辞書 である
    • code
    • message

iOS

iOS で JSON をパースするためには NSJSONSerialization クラスを使用します。

サンプルコード

@interface ViewController ()

@property (nonatomic, readonly) NSString *jsonString;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self parseJson];
}

- (void)parseJson
{
    NSData *jsonData = [self.jsonString dataUsingEncoding:NSUTF8StringEncoding];

    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData
                                                    options:kNilOptions
                                                      error:nil];

    NSDictionary *error = [jsonObject[@"errors"] firstObject];

    // "code" の値を取得
    NSLog(@"%@", error[@"code"]);
    // -> 215

    // "message" の値を取得
    NSLog(@"%@", error[@"message"]);
    // -> Bad Authentication data.
}

- (NSString *)jsonString
{
    return @"{\"errors\":[{\"code\":215,\"message\":\"Bad Authentication data.\"}]}";
}

@end

解説

id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData
                                                options:kNilOptions
                                                  error:nil];

JSON のデータから NSJSONSerialization のインスタンスを生成しています。
通常、この戻り値の型は NSArray または NSDictionary です。

options には以下のオプションを指定することができます。

  • NSJSONReadingMutableContainers
    • 配列や辞書を可変オブジェクトとして生成する
  • NSJSONReadingMutableLeaves
    • すみません、よくわかりません
  • NSJSONReadingAllowFragments
    • NSArrayNSDictionary 以外の型の戻り値を許容する

今回はどれも不要なので kNilOptions を指定しています。
kNilOptions の値は 0 です。


NSDictionary *error = [jsonObject[@"errors"] firstObject];

取得した JSON オブジェクトから、エラー情報を取り出しています。
このコードでは配列の単一要素である辞書を取り出し、error という変数に代入しています。


NSLog(@"%@", error[@"code"]);
NSLog(@"%@", error[@"message"]);

エラー情報の code キーmessage キー の値を取り出し、ログ出力しています。


XML よりもはるかに簡単ですね。

Android

Android で JSON をパースするためには JSONObject クラスを使用します。

サンプルコード

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            parseJson();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void parseJson() throws JSONException {
        JSONObject jsonObject = new JSONObject(jsonString());

        JSONObject error = jsonObject.getJSONArray("errors").getJSONObject(0);

        // "code" の値を取得
        System.out.println(error.getString("code"));
        // -> 215

        // "message" の値を取得
        System.out.println(error.getString("message"));
        // -> Bad Authentication data.
    }

    private String jsonString() {
        return "{\"errors\":[{\"code\":215,\"message\":\"Bad Authentication data.\"}]}";
    }
}

解説

JSONObject jsonObject = new JSONObject(jsonString());

JSON のデータから JSONObject のインスタンスを生成しています。


JSONObject error = jsonObject.getJSONArray("errors").getJSONObject(0);

errors の値(配列)を取得し、その先頭要素を error という JSONObject 型の変数に代入しています。

キーに対応する値の型によって、取得するときのメソッドを使い分けます。

  • 辞書(連想配列)
    • getJSONObject()
  • 配列
    • getJSONArray()
  • 文字列
    • getString()

など。


System.out.println(error.getString("code"));
System.out.println(error.getString("message"));

エラー情報の code キーmessage キー の値を取り出し、ログ出力しています。

まとめ

  • JSON のパースは以下のクラスを使用すれば実現可能
    • iOS: NSJSONSerialization
    • Android : JSONObject
  • ライブラリを使わずとも、短いコードで書くことができる
  • そんなに難しくない

リンク

ミレニアム・ファルコン製作日記 #20

20 号 表紙

mfd_20_1

パーツ

mfd_20_2

mfd_20_3

mfd_20_4

成果

mfd_20_5

mfd_20_6

今回の作業は以下の 2 つでした。

  • 通路ライナーを組み立てる
  • 通路チューブを組み立てる

前回に引き続き、通路チューブを組み立てました。
こちらはコクピットへと続く通路になります。

今回は細長いクッションパッドを出入り口部分に貼り付けました。
ひとつとして同じパッドは無いので間違えないように注意。
この作業は単調では無かったため楽しかったです。

それにしてもミレニアム・ファルコン内はクッションパッドが多いですね。
汚れ具合もいい感じ。
一度でいいから実物を触ってみたいものです。

それではまた次回。

May the Force be with you!