NSObject到json?

时间:2011-12-24 00:57:51

标签: php iphone objective-c ios json

我想将personArray转换为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的更漂亮的解决方案?

4 个答案:

答案 0 :(得分: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); 

答案 1 :(得分: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"];

另见:

答案 2 :(得分:0)

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

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

对我来说,看起来很可疑。你在json字符串的开头贴了一个引号,这将导致第一个键“在它前面有一个流浪。”最后只是看起来很虚伪。

为什么不使用实际的JSON库(例如touchjsonsbjson)而不是拼凑一些字符串?

答案 3 :(得分:0)

我很惊讶这给了你任何东西。首先,这条线......

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

......什么都不做。 stringByAppendingFormat:基于接收方返回一个新字符串(即json),它不会修改接收方。此外,您正在创建一个带有格式的新字符串,以使用格式附加到json;它可以简化为:

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

此外,不是不断创建新字符串并且可能充斥自动释放池,而是使用NSMutableString代替,并使用执行appendFormat:或appendString:方法>修改接收器而不是创建新的字符串。

正如其他人所提到的,JSON可能无法正确解码的原因是因为它可能格式不正确,JSON字符串中存在迷路\"