2011-12-24 70 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字符串中存在一个流浪的\"