2013年12月30日月曜日

iOSとAndroidでjson

もうひとつのプロフェッショナルプログラマーからの転載まとめ版です。 こちらがオリジナル iOS版(日本語) Android版(English) ネットワーク関係のプログラミングをしていると, json形式のデータを扱うことがあります。 サーバ側, クライアント側両方です。 筆者の場合, iOS, Android, Amazon KindleのIn app purchase(billing)なんかの, レシートを扱うときに,使用しました。

iOS

iOSには, 5以降で NSJSONSerialization クラスというが登場しました。 JSONObjectWithData というメソッドで, NSDataをNSArrayや, NSDictionaryなどに変換できます 返り値はidで, NSArray, NSDictionaryもしくはMutable系となります。 NSDataを引数として取るので, NSString の場合は変換の必要があります。 オプションとして, NSJSONReadingMutableContainers, NSJSONReadingMutableLeaves, NSJSONReadingAllowFragments 後ろの二つがどのような場面で利用できるかいまいちわかっていないです。 iOS Developer Libraryに説明がでています。

NSString -> json -> NSArray, NSDictionary

NSString *str = @"[{\"key\":\"value\"}]";
NSError *error = nil;
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"%@", array);
NSLog(@"%@", [array objectAtIndex:0]);
この場合, NSDictonaryとしてデータを扱えます。 このように, NSArray, NSMutableArray, NSDictionary, NSMutableDictionary として扱えるので, 大変便利です。

NSDictionary -> json -> NSData

// dict to json(NSData)
NSMutableDictionary *mdic = [[NSMutableDictionary alloc] init];
[mdic setObject:@"madoka" forKey:@"name"];
[mdic setObject:[NSNumber numberWithInt:14] forKey:@"age"];
     
if([NSJSONSerialization isValidJSONObject:mdic]){
    NSData *json = [NSJSONSerialization dataWithJSONObject:mdic    options:NSJSONWritingPrettyPrinted error:&error];        
    NSLog(@"json %@", [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding] );
        
}
// Result
// json {
//  "age" : 14,
//  "name" : "madoka"
//}

NSJSONSerializationのdataWithJSONObjectを使って, NSMutableDictionaryを jsonにそして, NSDataにしてNSStringで表示させています。isValidJSONObjectを 使うと, 正しい形式かどうかをチェックできます。

Android

さて, こちらは外部ライブラリの力を借ります。 JSON-javaというのがあります。 以前, サーバ側で利用していたのですが, Androidでも利用できそうなので, Android仕様でコンパイルしてみましたが うまくいきましたので, そのまま利用してみました。

サンプル

文字列をJSONObjectに変換, キーを使って取り出したり, 文字列型に変換したりします。
String str = "{\"key\":\"value\"}";
JSONObject jobj = new JSONObject(str);
String value = jobj.getString("key");
// Long, Boolean, Object, JSONArray, JSONOject
System.out.println(value); // "value"
         
String str2 = "{\"name\":\"Homuhomu\", \"age\":14}";
JSONObject jobj2 = new JSONObject(str2);
Integer age = jobj2.getInt("age");
System.out.println(age);   // 14
System.out.println(jobj2.toString());  // String style

0 件のコメント:

コメントを投稿