NSJSONSSerialization JSONシーケンス化を実現

3484 ワード

簡単に述べる


iOS 5では,アップルがJSON列を解析するNSJSONSSerializationクラスを導入した.このクラスにより、JSONデータとNSDictionaryとNSArrayとの変換を完了できます.サードパーティ製ライブラリを別途使用する必要はありません.

一、NSDictionaryまたはNSArrayをJSON列に変換する

//           JSON 
- (NSData *)toJSONData:(id)theData{
    
    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:theData
                                                      options:NSJSONWritingPrettyPrinted
                                                         error:&error];
    
    if ([jsonData length] > 0 && error == nil){
        return jsonData;
    }else{
        return nil;
    }

    //         ,          JSON 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData
                                                 encoding:NSUTF8StringEncoding];
}

シーケンス化関数の説明

  • まずこのコード
  • を見てください.
    /* Generate JSON data from a Foundation object. If the object will not produce valid JSON then an exception will be thrown. Setting the NSJSONWritingPrettyPrinted option will generate JSON with whitespace designed to make the output more readable. If that option is not set, the most compact possible JSON will be generated. If an error occurs, the error parameter will be set and the return value will be nil. The resulting data is a encoded in UTF-8.*/
    +(nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
    
  • この方法はObjective-CでオブジェクトからJSONを生成するために使用され、タイプNSJSOnWritingOptionsアップルは「Options for writing JSON data」と記述されている.公式の説明ではNSJSOnWritingOptionsを設定すると読解性が向上し、設定しないと欲しいフォーマットが得られますが、ここを見ると
  • という列挙しかありません.
    typedef NS_OPTIONS(NSUInteger, NSJSONWritingOptions) {
        NSJSONWritingPrettyPrinted = (1UL << 0)
    } NS_ENUM_AVAILABLE(10_7, 5_0);
    

    二、JSON列をNSDictionaryまたはNSArrayに変換する

    // NSString   NSData
    [jsonString dataUsingEncoding:NSASCIIStringEncoding];
    
    //  JSON          
    - (id)toArrayOrNSDictionary:(NSData *)jsonData{
        NSError *error = nil;
        id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData
                                                        options:NSJSONReadingAllowFragments
                                                          error:&error];
        
        if (jsonObject != nil && error == nil){
            return jsonObject;
        }else{
            //     
             return nil;
        }
    
    }
    

    三、JSON列とNSArrayとNSDictionaryの操作をカプセル化する


    もちろん、NSObjectとNSStringの分類で直接貼り付けることを定義する場合も多いです.

    1.NSStringをNSArrayまたはNSDictionaryに変換する

    #import "NSString+JSONCategories.h" // ------       category
    @implementation NSString(JSONCategories)
    
    -(id)JSONValue {
        NSData* data = [self dataUsingEncoding:NSUTF8StringEncoding];
        __autoreleasing NSError* error = nil;
        id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        if (error != nil) return nil;
        return result;
    }
    @end
    

    2.NSArrayまたはNSDictionaryをNSStringに変換

    #import "NSObject+JSONCategories.h"
    @implementation NSObject (JSONCategories)
    
    -(NSData*)JSONString {
        NSError* error = nil;
        id result = [NSJSONSerialization dataWithJSONObject:self
                                                    options:kNilOptions error:&error];
        if (error != nil) return nil;
        return result;
    }
    @end