iOS で JSON 形式データを作成する方法

json-framework → SBJson
TouchJSON
などが有名のようである。(2011/09時点)

ー SBJson を使用して、JSON 形式データを出力する
値に数値を指定したい場合、NSNumber をセットすればよい。

1
2
3
4
5
6
7
8
9
10
11
12
NSDictionary *dict0, *dict1;
dict0 = [NSDictionary dictionaryWithObjectsAndKeys:@"value00", @"key00", 
                                                   @"value01", @"key01", nil];
dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"value10", @"key10", 
                                                   @"value11", @"key11", nil];
NSArray *array = [[NSArray alloc] initWithObjects:dict0, dict1, nil];
 
SBJsonWriter *writer = [[[SBJsonWriter alloc] init] autorelease];
writer.humanReadable = YES;
writer.sortKeys = YES;
 
NSLog(@"%@", [writer stringWithObject:array]);

– 出力結果

1
2
3
4
5
6
7
8
9
10
[
  {
    "key00" : "value00",
    "key01" : "value01"
  },
  {
    "key10" : "value10",
    "key11" : "value11"
  }
]

iOS デバイスから WCF サーバへ POST でパラメータ (JSON形式) を送信する方法

– ASIFormDataRequest の場合

ASIFormDataRequest クラスを使用して POST する場合、Content-Type は以下のものが指定される。
‘application/x-www-form-urlencoded’
‘multipart/form-data’

上記以外の Content-Tpye を明示的に指定し、POST する場合は以下の様にする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Http通信 postでパラメータ(json形式)をサーバへ渡す
NSString *interfaceURL;
interfaceURL = [NSString stringWithFormat:@"http://(サーバ アドレス)"];    
 
NSURL *url = [NSURL URLWithString:interfaceURL];
request_ = [[ASIFormDataRequest alloc] initWithURL:url];
request_.delegate = self;
[request_ addRequestHeader:@"Content-Type" value:@"application/json; charset=utf-8"];
 
// WCFインタフェースへ渡すパラメータを json 形式に変換する
// NSDictionary → (json文字列) NSString
NSDictionary *dict;
dict = [NSDictionary dictionaryWithObjectsAndKeys:@"(値1)", @"(キー1)",  
                                                  @"(値2)", @"(キー2)", 
                                                  nil];
 
SBJsonWriter *writer = [[[SBJsonWriter alloc] init] autorelease];
writer.humanReadable = YES;
writer.sortKeys = YES;
NSLog(@"送信パラメータ:%@", [writer stringWithObject:dict]);
 
NSString *postParameterString;
postParameterString = [NSString stringWithFormat:@"%@", [writer stringWithObject:dict]];
 
// パラメータをボディにセットし、WCF サーバへ通信する
[request_ appendPostData:[postParameterString dataUsingEncoding:NSUTF8StringEncoding]];    
[request_ startAsynchronous];

xcode4 で static link library を追加する

以前の xcode3 でスタティックリンクライブラリを開発アプリのプロジェクトに追加するには、以下の手順でOKだったと思う。
1) スタティックリンクライブラリのプロジェクトを開発アプリのプロジェクトに追加
2) ライブラリのヘッダを [Header Search Paths] に追加
3) ライブラリが求めるビルド設定 [Other Linker Flags] に “-ObjC” と “-all_load” などを追加
4) ライブラリが求めるフレームワークの追加

しかし、xcode4 で上記の設定を行っても、開発アプリにライブラリの追加が正常に行われない。
以前からビルドしたスタティックリンクライブラリがどうして赤色で表示されているのか気になっていたので、調査した。

結果、xcode4 では、ビルドしたライブラリの格納場所が変更されており、プロジェクトがビルドしたライブラリを認識できていないとのこと。
→ 確かに、~/Library/Developer/Xcode/DerivedData/(プロジェクト名)/Build/Products/Debug-iphonesimulator と以前と異なる場所にビルドされている

解決方法は、いろいろ提示されているようだが。。。。
とりあえずは、手動リンクすることにした。(T_T)

補足: 2013/5 時点は CocoaPods を利用するのが楽だと思う。(^^)

NSDate, time_t の相互変換

1
2
3
4
5
// NSDate から time_t へ変換する
time_t now = (time_t) [[NSDate date] timeIntervalSince1970];
 
// time_t から NSDate へ変換する
NSDate *someDate = [NSDate dateWithTimeIntervalSince1970:now];