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 件のコメント:
コメントを投稿