2011-12-24 46 views
0

我想將personArray轉換爲JSON字符串,並向服務器發送請求。NSObject到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 Framewarkyajl-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 2011-12-24 06:22:57

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庫(例如touchjsonsbjson)而不是將字符串串起來?

0

我很驚訝這會給你帶來什麼。對於初學者來說,這條線......

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

&hellip;什麼都不做。 stringByAppendingFormat:返回一個基於接收方的新字符串(即json),它不會修改接收方。此外,您正在創建一個格式爲新的字符串,以格式附加到json;它可以簡化爲:

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

此外,而不是不斷地創造新的字符串和潛在的充斥自動釋放池,使用NSMutableString代替,並使用appendFormat:appendString:方法,修改接收器,而不是創建新的字符串。

正如其他人所說的,JSON可能無法正確解碼的原因是因爲它可能不完整,您的JSON字符串中存在一個流浪的\"