如何防止NSJSONSerialization在URL中添加额外的转义

时间:2013-10-29 06:14:10

标签: objective-c nsjsonserialization

如何阻止NSJSONSerialization在我的URL字符串中添加额外的反斜杠?

NSDictionary *info = @{@"myURL":@"http://www.example.com/test"};
NSData data = [NSJSONSerialization dataWithJSONObject:info options:0 error:NULL];
NSString *string = [[NSString alloc] initWithData:policyData encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);//{"myURL":"http:\/\/www.example.com\/test"}

我可以去除反斜杠并使用该字符串,但如果可能的话我想跳过这一步......

5 个答案:

答案 0 :(得分:19)

这对我有用

NSDictionary *policy = ....;
NSData *policyData = [NSJSONSerialization dataWithJSONObject:policy options:kNilOptions error:&error];
if(!policyData && error){
    NSLog(@"Error creating JSON: %@", [error localizedDescription]);
    return;
}

//NSJSONSerialization converts a URL string from http://... to http:\/\/... remove the extra escapes
policyStr = [[NSString alloc] initWithData:policyData encoding:NSUTF8StringEncoding];
policyStr = [policyStr stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"];
policyData = [policyStr dataUsingEncoding:NSUTF8StringEncoding];

答案 1 :(得分:4)

是的,这是非常恼人的,甚至更多,因为似乎没有“快速”解决这个问题(即NSJSONSerialization)

源:
http://www.blogosfera.co.uk/2013/04/nsjsonserialization-serialization-of-a-string-containing-forward-slashes-and-html-is-escaped-incorrectly/

NSJSONSerialization serialization of a string containing forward slashes / and HTML is escaped incorrectly


(只是在黑暗中拍摄,所以请耐心等待)
如果你正在创建自己的JSON,那么只需从字符串中创建一个NSData对象并将其发送到服务器 无需通过NSJSONSerialization。

类似的东西:

NSString *strPolicy = [info description];
NSData *policyData = [strPolicy dataUsingEncoding:NSUTF8StringEncoding];

我知道它不会那么简单,但......嗯...反正

答案 2 :(得分:3)

如果目标是> = iOS 13.0,则只需将.withoutEscapingSlashes添加到选项中。

示例:

lik_tab[] <- lapply(lik_tab, factor, levels = c("1", "2", "3", "4", "5"),
                                   ordered = TRUE)

答案 3 :(得分:1)

我已经跟踪此问题很多年了,但是仍然没有解决。我相信苹果公司永远不会因为遗留原因而修复它(它将破坏东西)。

Swift 4.2中的解决方案:

let fixedString = string.replacingOccurrences(of: "\\/", with: "/")

它将用\/替换所有/,并且这样做是安全的。

答案 4 :(得分:0)

我遇到了这个问题,并改用了现在可用的JSONEncoder解决了它。用代码说明:

Public Sub Browse_click(sender As Object, e As EventArgs) Handles browse.click