iOS开发 NSString转JSON、NSDictionary和JSON互转

1.应用场景

接口传输数据时,有时需要用POST传一长串string数据,一般要求转为json格式方便服务器解析

  • 解释:以接口参数的形式上传复杂日志的内容(字符串),此复杂字符串做为接口参数值必须转成json字符串,否则接口上传失败。

2.需要转义的字符说明

  • NSString转json时若包含以下字符,需要进行转义
"  (双引号)
/  (正斜线)
\n (换行符)
\b (退格符)
\f (换页符)
\r (回车符)
\t (制表符,一个tab或按8下空格)
等

3. 普通字符串转json字符串的方法实现

方法一:直接根据特殊字符定制方法进行转换(不建议)

  • 网上常见使用如下方法进行string转jsonstring,对于一些简单的转换需求这个可以实现,但是对于复杂情况并不能实现完全转换。
- (NSString *)string2JSONString:(NSString *)string {
    NSMutableString *s = [NSMutableString stringWithString:string];
    [s replaceOccurrencesOfString:@"\"" withString:@"\\\"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"/" withString:@"\\/" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\n" withString:@"\\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\b" withString:@"\\b" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\f" withString:@"\\f" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\r" withString:@"\\r" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\t" withString:@"\\t" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    return [NSString stringWithString:s];
}

方法二:先自定义字典存入string,使用自带的JSONSerialization把字典转成json后,删除key只保留value部分即可(推荐)

  • 1.读取包含特殊字符的文本,存入字符串midiStr
    NSString *midiPath = [[NSBundle mainBundle] pathForResource:@"test11" ofType:@"txt"];
    NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:midiPath];
    [readHandle seekToFileOffset:0];
    NSData* data = [readHandle readDataToEndOfFile];
    NSString *midiStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  • 2.midiStr存入自定义字典,并转成jsonString
  • 3.拆分jsonDictString,仅取json键对应的value值部分,即midiStr转换为了json字符串。

oc写法

+ (NSString *)stringToJsonStrWithStr:(NSString *)str{
    NSString *key = @"json";
    
    NSDictionary *tempDict = @{key: str};
    
    NSMutableString *tempJsonStr = [[NSMutableString alloc] initWithString:[NSString jsonStringFromDict:tempDict]];
    
    NSString *valueJsonStr1 = [tempJsonStr substringFromIndex:key.length+5];
    
    NSString *valueJsonStr2 = [[[NSMutableString alloc] initWithString:valueJsonStr1] substringToIndex:valueJsonStr1.length-2];
    
    return valueJsonStr2;
}

swift写法

static func stringToJsonStr(str: String) -> String{
        
        let key = "json"
        let tempDict = [key: str]
        
        if(!JSONSerialization.isValidJSONObject(tempDict)) {
            print("无法解析出JSONString")
            return ""
        }
        
        
        do {
            let data = try JSONSerialization.data(withJSONObject: tempDict)
            let jsonStr = String(data: data, encoding: .utf8) ?? ""
            //去除键,只留转化的value
            let json1 = jsonStr.dropFirst(key.count+4)//"{\"json\":
            let json2 = json1.dropLast(1)
            
            return String(json2)
        } catch let error as NSError {
            print(error)
            return ""
        }
    }

4. 字典和json互转方法实现

4-1 字典转JSON

  • OC 方法实现
- (NSString *)convert2JSONWithDictionary:(NSDictionary *)dic{
    NSError *err;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
    
    NSString *jsonString;
    if (!jsonData) {
        NSLog(@"%@",err);
    }else{
        jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    NSLog(@"%@",jsonString);
    return jsonString;
}
  • swift方法实现
public static func convertDictionaryToString(dict:[String:AnyObject]) -> String {
        var result:String = ""
        do {
          //如果设置options为JSONSerialization.WritingOptions.prettyPrinted,则打印格式更好阅读
          let jsonData = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions.init(rawValue: 0))
       
          if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
            result = JSONString
          }
       
        } catch {
          result = ""
        }
        return result
    }

4-2 JSON转字典

  • OC 方法实现
- (NSDictionary *)convert2DictionaryWithJSONString:(NSString *)jsonString{
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                        options:NSJSONReadingMutableContainers
                                                          error:&err];
    if(err)
    {
        NSLog(@"%@",err);
        return nil;
    }
    return dic;
}

  • swift 实现方法
static func convertStringToDictionary(text: String) -> [String:AnyObject]? {
        if let data = text.data(using: String.Encoding.utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: [JSONSerialization.ReadingOptions.init(rawValue: 0)]) as? [String:AnyObject]
                
            } catch let error as NSError {
                Log.error(error)
            }
        }
        return nil
    }

4-3 数组转json(同字典转json)

  • swift
    static func convertArrayToString(arr:[AnyObject]) -> String {
        var result:String = ""
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: arr, options: JSONSerialization.WritingOptions.init(rawValue: 0))
            if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
                result = JSONString
                
            }
            
        } catch {
            result = ""
            
        }
        return result
    }

5. 附场景应用:读取文本文件内容POST方法上传,参数放在body内

- (void)uploadJsonStringAsyn{
    //读取txt文件内容(包含回车空格等特殊字符)转为jsonString
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    NSString *midiPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
    NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:midiPath];
    [readHandle seekToFileOffset:0];
    NSData* data = [readHandle readDataToEndOfFile];
    NSString *midiStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    params[@"jsonString"] = [self stringToJsonStr:midiStr];
    
    //设置上传地址
    NSString *urlString = [NSString stringWithFormat:@"http://"];
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
    //添加参数
    [request setHTTPBody:jsonData];
    
    //创建session对象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //创建一个请求任务
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString *result = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"POST%@",result);
    }];
    
    [task resume];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • JSON JSON和XML都是需要解析的 JSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据...
    JonesCxy阅读 1,842评论 2 10
  • “吖清,你在家做嘛该 (干嘛?)”我问,大家已经不用拘谨了。 吖清一边开门,我一边问着。她家里现在还是一层,楼下两...
    Chosing_春幸阅读 364评论 0 0
  • 孙小美妞儿阅读 1,107评论 0 0
  • 成长的代价我尝到了 不想再尝了 太苦了 太痛心了 从今天开始 我会迎接一个全新的自己 放下吧 重新开始 是时候了
    心梦南国阅读 89评论 0 0