如何将转义的JSON字符串转换为NSString?

时间:2014-06-02 15:28:01

标签: ios objective-c json

我正在使用一个http服务器,它在响应正文中返回JSON字符串:

"Some text.\nSome text.\n\t\"Some text in quotes.\""

我需要在字符串的开头和结尾删除引号,我需要unescape特殊符号。我为NSString制作了类别,但我认为这是错误的实现:https://gist.github.com/virasio/59907e087f859e6c1723 我有其他的想法。我可以使用NSJSONSerialization:

NSString *sourceString = @"\"Some text.\\nSome text.\\n\\t\\\"Some text in quotes.\\\"\"";
NSString *jsonObject = [NSString stringWithFormat:@"{ \"value\" : %@ }", sourceString];
NSDictionary *object = [NSJSONSerialization JSONObjectWithData:[jsonObject dataUsingEncoding:NSUTF8StringEncoding options:0 error:NULL]];
NSString *result = [object objectForKey:@"value"];

但是......这也不好。

1 个答案:

答案 0 :(得分:8)

默认情况下,Foundation只会解析JSON对象或数组,但如果你告诉它接受JSON片段,它可以解析字符串,数字和布尔值:

NSData *data = [@"\"Some text.\\nSome text.\\n\\t\\\"Some text in quotes.\\\"\""
    dataUsingEncoding:NSUTF8StringEncoding];

id result = [NSJSONSerialization JSONObjectWithData:data
                                            options:NSJSONReadingAllowFragments
                                              error:NULL];
NSLog(@"[result class] = %@", [result class]);
NSLog(@"result = %@", result);

收率:

[result class] = __NSCFString
result = Some text.
Some text.
  "Some text in quotes."

这实际上是传递error确实有帮助的情况之一。我试过没有通过NSJSONReadingAllowFragments并得到一个非常明确的错误信息:

  

错误Domain = NSCocoaErrorDomain Code = 3840“操作无法完成。(Cocoa error 3840。)”( JSON文本没有以数组或对象开头,并且选项允许未设置片段。