NSObject 到 json?

Posted

技术标签:

【中文标题】NSObject 到 json?【英文标题】:NSObject to json? 【发布时间】:2011-12-24 00:57:50 【问题描述】:

我想将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?

【问题讨论】:

【参考方案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"];

另见:

Encoding custom classes using yajl-objc How to generate JSON programatically using JSON framework for iPhone Send NSMutableArray as JSON using JSON-Framework

【讨论】:

谢谢,这正是我想要的!!【参考方案2】:

在服务器上,您可能打开了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); 

【讨论】:

【参考方案3】:
 NSString *json = @" \"";//TODO

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

在我看来非常可疑。您在 json 字符串的开头添加了一个引号,这将导致第一个键前面有一个杂散的 "。最后的 " 看起来是假的。

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

【讨论】:

【参考方案4】:

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

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

……什么都不做。 stringByAppendingFormat: 根据接收者返回一个新的字符串(即json),它不会修改接收者。此外,您正在创建一个具有格式的新字符串,以附加到 json 的格式;可以简化为:

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

另外,与其不断创建新字符串并可能淹没自动释放池,不如改用NSMutableString,并使用appendFormat:appendString: 方法修改接收器而不是创建新字符串。

正如其他人所提到的,JSON 可能无法正确解码的原因是它可能格式不正确,您的 JSON 字符串中有一个杂散的\"

【讨论】:

以上是关于NSObject 到 json?的主要内容,如果未能解决你的问题,请参考以下文章

从 Json 将值存储到 NSObject

将复杂的 NSObject 序列化为 JSON 模式

将提要流项目 NSObject 存储在磁盘中或作为 JSON

如何从 json 字典自动创建模型类(NSObject)?

用于 JSON 解析的 NSDictionary 或自定义 NSObject

如何在 Swift 4 的 NSObject 类中初始化 json 内的数组?