2011-12-24 13 views
0

personArrayをJSON文字列に変換し、サーバーにリクエストを送信します。NSObject to json?

私は、次のようなコードを試みた:サーバーは、次のデータを受信

@interface Person : NSObject { 
    NSString *name; 
    int registered; 
} 
+ (NSMutableArray *) select; 
NSMutableArray *personArray = [Person select]; 


NSString *json = @"{ \"";//TODO 

for (int i =0 ;i < [personArray count]; i++) { 
    Person *temp = [Person objectAtIndex:i]; 

    [json stringByAppendingFormat:[NSString stringWithFormat:@"\"name\": \"%@\"", temp.name] 
} 
json = [json stringByAppendingFormat:[NSString stringWithFormat:@"} \""]]; 

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:[global userID] forKey:@"user_id"]; 
[request setPostValue:json forKey:@"json_key"]; 
[request addRequestHeader:@"Content-type" value:@"application/json"]; 

[request startSynchronous]; 

を:

{ \"\"name\": \"Tom\"} 

サーバーのコードはこれです:

$json = $_POST['json_key']; 
echo $json; 
$json = json_decode($json, true); 
echo $json; // prints nothing 

スラッシュを削除する方法はありますか?オブジェクトをJSONに変換するためのより良い解決策はありますか?

答えて

1

JSON表現が正しく生成されていることを確認するには、アドホック変換ではなく汎用JSONジェネレータ(Stig BrautasetのJSON Framewarkまたはyajl-objcなど)を使用してください。

JSONフレームワーク:

@interface Person(SBJson) 
-(id)proxyForJson; 
@end 

@implementation Person(SBJson) 
-(id)proxyForJson { 
return [NSDictionary dictionaryWithObjectsAndKeys: 
    name,@"name", 
    [NSNumber numberWithInt:registered],@"registered", 
    nil]; 
} 
@end 

... 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:[[Person select] JSONRepresentation] forKey:@"json_key"]; 

yajl-にObjC:

@interface Person(YAJL) 
-(id)JSON; 
@end 

@implementation Person(YAJL) 
-(id)JSON { 
return [NSDictionary dictionaryWithObjectsAndKeys: 
    name,@"name", 
    [NSNumber numberWithInt:registered],@"registered", 
    nil]; 
} 
@end 

... 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:[[Person select] yajl_JSONString] forKey:@"json_key"]; 

も参照してください:

+0

ありがとう、これは私が欲しかったものです! – tompal18

1

サーバーでは、おそらくmagic_quotes_gpcがオンになっている可能性があります。もっとこのような何かを試してみてください:

$json = $_POST['json_key']; 

if (get_magic_quotes_gpc()) { 
    $json = stripslashes($json); 
} 

echo $json; 
$json = json_decode($json, true); 
print_r($json); 
0
NSString *json = @"{ \"";//TODO 

json = [json stringByAppendingFormat:[NSString stringWithFormat:@"} \""]]; 

は私に強大な不審見て。あなたはjson文字列の先頭に引用符をつけています。最初のキーにはその前に迷いがあります。最後には "偽"と表示されます。

文字列のビットをつなぎ合わせるのではなく、実際のJSONライブラリ(例:touchjsonまたはsbjson)を使用してみませんか?

0

私はこれがあなたに何かを与えることに驚いています。初心者の方には、このライン&ヘリップ;

[json stringByAppendingFormat:[NSString stringWithFormat:@"\"name\": \"%@\"", temp.name]]; 

&hellip;全く何もしません。 stringByAppendingFormat:は受信者(つまりjson)に基づいて新しい文字列を返しますが、受信者は変更されません。また、書式付きの新しい文字列を作成して、jsonにフォーマットを追加します。それが簡単にすることができます。また

json = [json stringByAppendingFormat:@"\"name\": \"%@\"", temp.name]; 

、むしろ継続的に新しい文字列を作成し、潜在的に自動解放プールをフラッディングよりも、作成するよりも受信機をかなり修正代わりにNSMutableStringを使用して、を行うappendFormat:またはappendString:メソッドを使用します新しい文字列。

他にも言及したように、JSONが正しくデコードされない理由は、整形式が正しくない可能性があるためです。JSON文字列に浮かれている\"があります。