iOSのアップルが持参したjson解析NSJSONSSerialization(シーケンス化)
23431 ワード
NSJSONSSerializationの紹介:
NSJSONSSerializationでは、JSONデータをFoundationオブジェクト(一般的にNSDictionaryとNSArray)に変換し、FoundationオブジェクトをJSONデータに変換する(isValidJSOnObjectを呼び出すことでFoundationオブジェクトがJSONデータに変換できるか否かを判断できる)
JSONに変換するオブジェクトには、次の属性が必要です.
1.最上位オブジェクトはNSArrayまたはNSDictionaryである必要があります
2.すべてのオブジェクトはNSString、NSNumber、NSArray、NSDictionary、NSNullでなければなりません
3.すべてのNSDictionaryのキーはNSStringタイプである必要があります
4.数値オブジェクトは非数値または無限であることはできません(NSNumber)
関連パラメータ
紹介する
:
1.
NSJSONReadingOptions
NSJSOnReadingMutableContainers可変配列または辞書受信の作成
NSJSOnReadingMutableLeaves指定JSONオブジェクトで可変文字列がNSMutableStringとして作成されるインスタンス
NSJSOnReadingAllowFragments指定解析器が属さないNSArrayまたはNSDictionaryのインスタンスの最上位オブジェクトを許可する必要があります
2.
NSJSONWritingOptions
NSJSOnWritingPrettyPrintedとは、生成されたjsonデータをフォーマットして出力することを意味し、このように可読性が高く、設定しないと出力されるjson文字列が行全体である.3.
NSDictionaryのkeyはjson文字列のkey、objectはjson文字列のvalue、
変換の問題:(jsonFoundation)
1.jsonオブジェクトをFoundationデータ(+(id)JSONObjectWithData:options:error:)に変換します(NSDataは空にできません)
if (data) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}
2.Foundationオブジェクトをjsonデータ(+(NSData*)dataWithJSONObject:options:error:);(オブジェクトを空にすることはできません)
NSDictionary *dict = @{@"1" : @"a",@"2" : @"b"};
//
NSArray *arr = @[@"1",@"2"];
if
([
NSJSONSerialization
isValidJSONObject
:dict]) {
NSData
*data = [
NSJSONSerialization
dataWithJSONObject
:dict
options
:
NSJSONWritingPrettyPrinted
error
:
nil
];
NSString
*json = [[
NSString
alloc
]
initWithData
:data
encoding
:
NSUTF8StringEncoding
];
NSLog
(
@"%@"
,json);
}
jsonデータをサーバに送信:1.postリクエスト2です.要求ヘッダ3を設定.jsonデータをリクエストボディに設定する
2.[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
3.NSData *requestData = [NSJSONSerialization dataWithJSONObject:dictData options:NSJSONWritingPrettyPrinted error:nil];
JSON変換の関数の意味:
+ (BOOL)isValidJSONObject:(id)obj;//方法はFoundationオブジェクトがJSONオブジェクトに合法的に変換できるかどうかを検出することです
+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;//配列または辞書オブジェクトをNSDataオブジェクトに変換
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;//NSDataオブジェクトを配列または辞書に変換
+ (NSInteger)writeJSONObject:(id)obj toStream:(NSOutputStream *)stream options:(NSJSONWritingOptions)opt error:(NSError **)error;//JSONデータを出力ストリームに書き込み、書き込みストリームのバイト数を返します
+ (nullable id)JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;//入力ストリームからJSONデータを読み込む
===================
jsonとxmlの普及は個人的に読書の難易度を簡素化し、ネットワーク負荷を軽減するためだと思います.jsonとxmlデータフォーマットはフォーマットされた後も木状の構造で、木の藤が瓜を触ることができて、あなたの望む果物を得ることができます.
フォーマットしないときはjsonとxmlはまた普通の文字列で、ネットワーク通信の時も木の1つの値を得るために繰り返す要求サーバやターゲットホストではなく、1回だけ要求する必要があります.
jsonとxmlはいずれもキー値の形式でデータを格納する.
xml使用:値キー>
json使用:キー:値
アップル社は公式のjson解析ライブラリNSJSONSSerializationを提供した.
NSJSONSSerializationには、jsonデータを異なるデータ形式で解析する2つの方法が含まれています.
1、+ ( id )JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError ** )error;//バッファデータを使用して解析
2、+ ( id )JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;//ファイルストリームの形式を使用してjsonを解析する
jsonを解析するには、まずjson文字列をバッファに読み出し、NSJSONSSerializationの中の方法で解析を行い、jsonフォーマットによって返されるデータ型が異なる可能性があるので、idタイプで接続するのが望ましい.
eg: id dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
解析後のデータを得ると、一歩一歩、キー-値を一つずつ探して、あなたが望んでいるドンドンを探します.
Eg 1:jsonデータをローカルファイルから読み出し、バッファに読み出す.
Eg 2:jsonを解析するためにネットワークパスを使用し、
Eg 3:ネットワークパスを用いてjsonを解析する.NSURLRequestとNSURLConnectionを使用してネットワークデータを要求します.
NSJSONSSerializationでは、JSONデータをFoundationオブジェクト(一般的にNSDictionaryとNSArray)に変換し、FoundationオブジェクトをJSONデータに変換する(isValidJSOnObjectを呼び出すことでFoundationオブジェクトがJSONデータに変換できるか否かを判断できる)
JSONに変換するオブジェクトには、次の属性が必要です.
1.最上位オブジェクトはNSArrayまたはNSDictionaryである必要があります
2.すべてのオブジェクトはNSString、NSNumber、NSArray、NSDictionary、NSNullでなければなりません
3.すべてのNSDictionaryのキーはNSStringタイプである必要があります
4.数値オブジェクトは非数値または無限であることはできません(NSNumber)
関連パラメータ
紹介する
:
1.
NSJSONReadingOptions
NSJSOnReadingMutableContainers可変配列または辞書受信の作成
NSJSOnReadingMutableLeaves指定JSONオブジェクトで可変文字列がNSMutableStringとして作成されるインスタンス
NSJSOnReadingAllowFragments指定解析器が属さないNSArrayまたはNSDictionaryのインスタンスの最上位オブジェクトを許可する必要があります
2.
NSJSONWritingOptions
NSJSOnWritingPrettyPrintedとは、生成されたjsonデータをフォーマットして出力することを意味し、このように可読性が高く、設定しないと出力されるjson文字列が行全体である.3.
NSDictionaryのkeyはjson文字列のkey、objectはjson文字列のvalue、
変換の問題:(jsonFoundation)
1.jsonオブジェクトをFoundationデータ(+(id)JSONObjectWithData:options:error:)に変換します(NSDataは空にできません)
if (data) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}
2.Foundationオブジェクトをjsonデータ(+(NSData*)dataWithJSONObject:options:error:);(オブジェクトを空にすることはできません)
NSDictionary *dict = @{@"1" : @"a",@"2" : @"b"};
//
NSArray *arr = @[@"1",@"2"];
if
([
NSJSONSerialization
isValidJSONObject
:dict]) {
NSData
*data = [
NSJSONSerialization
dataWithJSONObject
:dict
options
:
NSJSONWritingPrettyPrinted
error
:
nil
];
NSString
*json = [[
NSString
alloc
]
initWithData
:data
encoding
:
NSUTF8StringEncoding
];
NSLog
(
@"%@"
,json);
}
jsonデータをサーバに送信:1.postリクエスト2です.要求ヘッダ3を設定.jsonデータをリクエストボディに設定する
2.[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
3.NSData *requestData = [NSJSONSerialization dataWithJSONObject:dictData options:NSJSONWritingPrettyPrinted error:nil];
JSON変換の関数の意味:
+ (BOOL)isValidJSONObject:(id)obj;//方法はFoundationオブジェクトがJSONオブジェクトに合法的に変換できるかどうかを検出することです
+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;//配列または辞書オブジェクトをNSDataオブジェクトに変換
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;//NSDataオブジェクトを配列または辞書に変換
+ (NSInteger)writeJSONObject:(id)obj toStream:(NSOutputStream *)stream options:(NSJSONWritingOptions)opt error:(NSError **)error;//JSONデータを出力ストリームに書き込み、書き込みストリームのバイト数を返します
+ (nullable id)JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;//入力ストリームからJSONデータを読み込む
===================
jsonとxmlの普及は個人的に読書の難易度を簡素化し、ネットワーク負荷を軽減するためだと思います.jsonとxmlデータフォーマットはフォーマットされた後も木状の構造で、木の藤が瓜を触ることができて、あなたの望む果物を得ることができます.
フォーマットしないときはjsonとxmlはまた普通の文字列で、ネットワーク通信の時も木の1つの値を得るために繰り返す要求サーバやターゲットホストではなく、1回だけ要求する必要があります.
jsonとxmlはいずれもキー値の形式でデータを格納する.
xml使用:値キー>
json使用:キー:値
アップル社は公式のjson解析ライブラリNSJSONSSerializationを提供した.
NSJSONSSerializationには、jsonデータを異なるデータ形式で解析する2つの方法が含まれています.
1、+ ( id )JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError ** )error;//バッファデータを使用して解析
2、+ ( id )JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;//ファイルストリームの形式を使用してjsonを解析する
/* Create a Foundation object from JSON data. Set the NSJSONReadingAllowFragments option if the parser should allow top-level objects that are not an NSArray or NSDictionary. Setting the NSJSONReadingMutableContainers option will make the parser generate mutable NSArrays and NSDictionaries. Setting the NSJSONReadingMutableLeaves option will make the parser generate mutable NSString objects. If an error occurs during the parse, then the error parameter will be set and the result will be nil.
The data must be in one of the 5 supported encodings listed in the JSON specification: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. The data may or may not have a BOM. The most efficient encoding to use for parsing is UTF-8, so if you have a choice in encoding the data passed to this method, use UTF-8.
*/
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
/* Create a JSON object from JSON data stream. The stream should be opened and configured. All other behavior of this method is the same as the JSONObjectWithData:options:error: method.
*/
+ (id)JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;
jsonを解析するには、まずjson文字列をバッファに読み出し、NSJSONSSerializationの中の方法で解析を行い、jsonフォーマットによって返されるデータ型が異なる可能性があるので、idタイプで接続するのが望ましい.
eg: id dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
解析後のデータを得ると、一歩一歩、キー-値を一つずつ探して、あなたが望んでいるドンドンを探します.
Eg 1:jsonデータをローカルファイルから読み出し、バッファに読み出す.
- (void)jsonParse{
// 。
NSString* path = [[NSBundle mainBundle] pathForResource:@"nanjing" ofType:@"txt"];
// , NSUTF8StringEncoding ,
NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 。
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
// json , JSONObjectWithData: options: error:
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
// 。 。
NSArray* arrayResult =[dic objectForKey:@"results"];
NSDictionary* resultDic = [arrayResult objectAtIndex:0];
NSDictionary* geometryDic = [resultDic objectForKey:@"geometry"];
NSLog(@"geometryDic: %@, resultDic:%@",geometryDic,resultDic);
NSDictionary* locationDic = [geometryDic objectForKey:@"location"];
NSNumber* lat = [locationDic objectForKey:@"lat"];
NSNumber* lng = [locationDic objectForKey:@"lng"];
NSLog(@"lat = %@, lng = %@",lat,lng);
[jsonString release];
}
Eg 2:jsonを解析するためにネットワークパスを使用し、
- (void)jsonParse{
// 。
NSString* path = @"http://maps.googleapis.com/maps/api/geocode/json?address=nanjing&sensor=true";
// url
NSURL* url = [NSURL URLWithString:path];
// , NSUTF8StringEncoding ,
NSString* jsonString = [[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
// 。
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
// json , JSONObjectWithData: options: error:
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
// ,
NSArray* arrayResult =[dic objectForKey:@"results"];
NSDictionary* resultDic = [arrayResult objectAtIndex:0];
NSDictionary* geometryDic = [resultDic objectForKey:@"geometry"];
NSLog(@"geometryDic: %@, resultDic:%@",geometryDic,resultDic);
NSDictionary* locationDic = [geometryDic objectForKey:@"location"];
NSNumber* lat = [locationDic objectForKey:@"lat"];
NSNumber* lng = [locationDic objectForKey:@"lng"];
NSLog(@"lat = %@, lng = %@",lat,lng);
[jsonString release];
}
Eg 3:ネットワークパスを用いてjsonを解析する.NSURLRequestとNSURLConnectionを使用してネットワークデータを要求します.
- (void)jsonParse{
// 。
NSString* path = @"http://maps.googleapis.com/maps/api/geocode/json?address=nanjing&sensor=true";
// url
NSURL* url = [NSURL URLWithString:path];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
// 。
NSData* jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// json , JSONObjectWithData: options: error:
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
// ,
NSArray* arrayResult =[dic objectForKey:@"results"];
NSDictionary* resultDic = [arrayResult objectAtIndex:0];
NSDictionary* geometryDic = [resultDic objectForKey:@"geometry"];
NSLog(@"geometryDic: %@, resultDic:%@",geometryDic,resultDic);
NSDictionary* locationDic = [geometryDic objectForKey:@"location"];
NSNumber* lat = [locationDic objectForKey:@"lat"];
NSNumber* lng = [locationDic objectForKey:@"lng"];
NSLog(@"lat = %@, lng = %@",lat,lng);
}