Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

6.2 JSONのシリアライズとデシリアライズ

ginrou edited this page Jun 5, 2013 · 5 revisions

WebAPIやJSONRPCを利用する際、よくフォーマットとして利用されるのがJSONです。Foundation FrameworkにもJSONのシリアライズやデシリアライズを行うクラスが含まれています。この章ではそのクラスの利用法を説明します。

クラスリファレンスはこちら http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

NSJSONSerialization

JSONのシリアライズ、デシリアライズを行うクラスはNSJSONSerializationです。このクラスを用いてNSData <--> JSONオブジェクトを変換するには以下の制約があります。

  • トップレベルオブジェクトはNSArrayかNSDictionaryである
  • 全てのオブジェクトは, NSString, NSNumber, NSArray, NSDictionary, NSNull いずれかのインスタンスである
  • 全ての辞書のキーはNSString
  • 数値はNaNや無限でない

NSJSONSerialization Class Reference より訳

変換することができるかを調べるメソッドとして+ (BOOL)isValidJSONObject:(id)objがあります。

NSData → JSONオブジェクト

NSURLConnectionのレスポンスなどの結果をJSONオブジェクトに変換します。変換には

+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error

を用います。引数としてNSDataとオプション、NSErrorへのポインタを渡します。デシリアライズに失敗した時は戻り値がnilとなりerrorにその理由が含まれます。またオプションには以下の物があります

オプション 説明
NSJSONReadingMutableContainers 利用するオブジェクトをNSMutableArray, NSMutabileDictionaryで変換します
NSJSONReadingMutableLeaves オブジェクトのキーとしてNSMutableStringを用います
NSJSONReadingAllowFragments JSONのトップレベルオブジェクトとしてDictionary, Array以外を指定できます。( "hoge" のような文字列のみでも変換できます)

実行例

以下の文字列についてパースを行います。

{"employees":[{"lastName":"Doe","firstName":"John"},{"lastName":"Smith","firstName":"Anna"},{"lastName":"Jones","firstName":"Peter"}]}

変換コード

    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@", obj);

出力結果

{
    employees =     (
                {
            firstName = John;
            lastName = Doe;
        },
                {
            firstName = Anna;
            lastName = Smith;
        },
                {
            firstName = Peter;
            lastName = Jones;
        }
    );
}

JSONオブジェクト → NSData

JSONオブジェクトからNSDataへの変換には

+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error

を用います。基本的な使い方は上記の逆となります。JSONのトップレベルオブジェクトを引数として渡します。同時にオプションとエラーへのポインタを渡します。変換に成功したらUTF-8でエンコードされた文字列のNSDataが返されます。エラーがあったときはerrorにその内容が含まれます。

上記データを逆にNSDataに変換したサンプルは以下のようになります。

変換コード

NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:0 error:nil];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

出力結果

{"employees":[{"lastName":"Doe","firstName":"John"},{"lastName":"Smith","firstName":"Anna"},{"lastName":"Jones","firstName":"Peter"}]}

またオプションとしてNSJSONWritingPrettyPrintedを渡すと改行やインデントを含めた文字列のNSDataがレスポンスになります。

{
  "employees" : [
    {
      "lastName" : "Doe",
      "firstName" : "John"
    },
    {
      "lastName" : "Smith",
      "firstName" : "Anna"
    },
    {
      "lastName" : "Jones",
      "firstName" : "Peter"
    }
  ]
}

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally