JSON转换传给JS时的特殊处理

背景介绍

Native和JS的交互如果采用第三方库WebViewJavascriptBridge,这个问题就不会有。这个问题也是在看这个第三方库源码的时候发现的。如果要自己写,那么这部分代码要移植过去。不然的话,会出现有时候JS解析JSON不正确的现象

Object-C版

- (NSString *)toJsonString:(NSDictionary *)dictionary {
    if (nil == dictionary) {
        return nil;
    }
    
    NSString *jsonString = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:dictionary options:(NSJSONWritingOptions)0 error:nil] encoding:NSUTF8StringEncoding];
    
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\u2028" withString:@"\\u2028"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\u2029" withString:@"\\u2029"];
    
    return jsonString;
}

- (NSDictionary *)toDictionary:(NSString *)jsonString {
    if (nil == jsonString) {
        return nil;
    }
    // 去掉百分号,中文等特殊编码
    NSString *tempString = [NSString stringWithFormat:@"%@", jsonString];
    tempString = [tempString stringByRemovingPercentEncoding];
    return [NSJSONSerialization JSONObjectWithData:[tempString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
}

Swift版

func assembledJS(response: [String: AnyObject]?, type: CallbackType = .Success) -> String? {
    guard let response = response else {
        return nil
    }
    let pre = "bridge.invokeJs('"
    let last = "')"
    var callbackId: NSNumber?
    if type == .Success {
        callbackId = params?["success"] as? NSNumber
    } else {
        callbackId = params?["fail"] as? NSNumber
    }
    
    if let callbackId = callbackId {
        let result = ["response": response,
                      "callbackId": callbackId]
        
        do {
            let data = try NSJSONSerialization.dataWithJSONObject(result, options: NSJSONWritingOptions(rawValue: 0))
            guard var  str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String else {
                return assembledJS(["message": "native convert json error"], type: .Failure)
            }
         
            str = str.stringByReplacingOccurrencesOfString("\\", withString: "\\\\")
            str = str.stringByReplacingOccurrencesOfString("\"", withString: "\\\"")
            str = str.stringByReplacingOccurrencesOfString("\'", withString: "\\\'")
            str = str.stringByReplacingOccurrencesOfString("\n", withString: "\\n")
            str = str.stringByReplacingOccurrencesOfString("\r", withString: "\\r")
            str = str.stringByReplacingOccurrencesOfString("\u{000C}", withString: "\\u{000C}") //\f
            str = str.stringByReplacingOccurrencesOfString("\u{2028}", withString: "\\u{2028}") //LINE SEPARATOR
            str = str.stringByReplacingOccurrencesOfString("\u{2029}", withString: "\\u{2029}") //PARAGRAPH SEPARATOR
            
            return "\(pre)\(str)\(last)"
        } catch {
            log("由dic拼装json出错, 默认执行出错回调")
            return assembledJS(["message": "native convert json error"], type: .Failure)
        }
    } else {
        log("不需要回调")
        return nil
    }
}

不同之处

  • Object-C中字符串是NSString,是Foundation的库函数,不是Unicode的

  • Swift中字符串String是语言自带的结构体,是Unicode编码的。

  • 一般情况下,两者在使用中基本没差别,可以共存,也可以很方便地相互转换。

  • 在转义字符等特殊场合,两者的表示还是有差异的。比如NSString的“\f”,对应String中的"\u{000c}"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,901评论 4 61
  • 宝宝从一出生,他们就会用自己的独特方式来认识周围的世界。好的宝宝玩具可以促进宝宝大脑的发育,促进手眼协调能力,让...
    辣妈帮6868阅读 606评论 0 0
  • 既然目标选择了地平线,留给世界的只能是背影。 很遗憾,这样给人鼓励的句子,我却无法细细体会一番。能做...
    一禾一阅读 327评论 0 0
  • 今天看到一句真的很对。结婚了变穷了,但是学会了生活。从前的自己每天都是那样幻想着,每天伤春悲秋,梨花带雨的也许期待...
    倚梦听云阅读 121评论 0 0

友情链接更多精彩内容