[iOS][Android] ライブラリを使わずに JSON をパースする
そんなに難しくないよ
以前紹介した 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
- NSArray と NSDictionary 以外の型の戻り値を許容する
今回はどれも不要なので 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 号 表紙
パーツ
成果
今回の作業は以下の 2 つでした。
- 通路ライナーを組み立てる
- 通路チューブを組み立てる
前回に引き続き、通路チューブを組み立てました。
こちらはコクピットへと続く通路になります。
今回は細長いクッションパッドを出入り口部分に貼り付けました。
ひとつとして同じパッドは無いので間違えないように注意。
この作業は単調では無かったため楽しかったです。
それにしてもミレニアム・ファルコン内はクッションパッドが多いですね。
汚れ具合もいい感じ。
一度でいいから実物を触ってみたいものです。
それではまた次回。
May the Force be with you!