iOS開發(fā) NSString轉(zhuǎn)JSON、NSDictionary和JSON互轉(zhuǎn)

1.應(yīng)用場景

接口傳輸數(shù)據(jù)時,有時需要用POST傳一長串string數(shù)據(jù),一般要求轉(zhuǎn)為json格式方便服務(wù)器解析

  • 解釋:以接口參數(shù)的形式上傳復(fù)雜日志的內(nèi)容(字符串)糖赔,此復(fù)雜字符串做為接口參數(shù)值必須轉(zhuǎn)成json字符串萍丐,否則接口上傳失敗。

2.需要轉(zhuǎn)義的字符說明

  • NSString轉(zhuǎn)json時若包含以下字符,需要進行轉(zhuǎn)義
"  (雙引號)
/  (正斜線)
\n (換行符)
\b (退格符)
\f (換頁符)
\r (回車符)
\t (制表符,一個tab或按8下空格)
等

3. 普通字符串轉(zhuǎn)json字符串的方法實現(xiàn)

方法一:直接根據(jù)特殊字符定制方法進行轉(zhuǎn)換(不建議)

  • 網(wǎng)上常見使用如下方法進行string轉(zhuǎn)jsonstring放典,對于一些簡單的轉(zhuǎn)換需求這個可以實現(xiàn)逝变,但是對于復(fù)雜情況并不能實現(xiàn)完全轉(zhuǎn)換。
- (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把字典轉(zhuǎn)成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存入自定義字典弥臼,并轉(zhuǎn)成jsonString
  • 3.拆分jsonDictString宴咧,僅取json鍵對應(yīng)的value值部分,即midiStr轉(zhuǎn)換為了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) ?? ""
            //去除鍵掺栅,只留轉(zhuǎn)化的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互轉(zhuǎn)方法實現(xiàn)

4-1 字典轉(zhuǎn)JSON

  • OC 方法實現(xiàn)
- (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方法實現(xiàn)
public static func convertDictionaryToString(dict:[String:AnyObject]) -> String {
        var result:String = ""
        do {
          //如果設(shè)置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轉(zhuǎn)字典

  • OC 方法實現(xiàn)
- (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 實現(xiàn)方法
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 數(shù)組轉(zhuǎn)json(同字典轉(zhuǎn)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. 附場景應(yīng)用:讀取文本文件內(nèi)容POST方法上傳,參數(shù)放在body內(nèi)

- (void)uploadJsonStringAsyn{
    //讀取txt文件內(nèi)容(包含回車空格等特殊字符)轉(zhuǎn)為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];
    
    //設(shè)置上傳地址
    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];
    //添加參數(shù)
    [request setHTTPBody:jsonData];
    
    //創(chuàng)建session對象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //創(chuàng)建一個請求任務(wù)
    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];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纳猪,一起剝皮案震驚了整個濱河市氧卧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氏堤,老刑警劉巖沙绝,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鼠锈,居然都是意外死亡闪檬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門购笆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粗悯,“玉大人,你說我怎么就攤上這事同欠⊙” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵行您,是天一觀的道長。 經(jīng)常有香客問我剪廉,道長娃循,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任斗蒋,我火速辦了婚禮捌斧,結(jié)果婚禮上笛质,老公的妹妹穿的比我還像新娘。我一直安慰自己捞蚂,他們只是感情好妇押,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姓迅,像睡著了一般敲霍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丁存,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天肩杈,我揣著相機與錄音,去河邊找鬼解寝。 笑死扩然,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的聋伦。 我是一名探鬼主播夫偶,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼觉增!你這毒婦竟也來了兵拢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤抑片,失蹤者是張志新(化名)和其女友劉穎卵佛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敞斋,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡截汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了植捎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙解。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焰枢,靈堂內(nèi)的尸體忽然破棺而出蚓峦,到底是詐尸還是另有隱情,我是刑警寧澤济锄,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布暑椰,位于F島的核電站,受9級特大地震影響荐绝,放射性物質(zhì)發(fā)生泄漏一汽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一低滩、第九天 我趴在偏房一處隱蔽的房頂上張望召夹。 院中可真熱鬧岩喷,春花似錦、人聲如沸监憎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲸阔。三九已至偷霉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隶债,已是汗流浹背腾它。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留死讹,地道東北人瞒滴。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像赞警,于是被迫代替她去往敵國和親妓忍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,090評論 1 32
  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式愧旦,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,847評論 2 10
  • “吖清世剖,你在家做嘛該 (干嘛?)”我問笤虫,大家已經(jīng)不用拘謹了旁瘫。 吖清一邊開門,我一邊問著琼蚯。她家里現(xiàn)在還是一層酬凳,樓下兩...
    Chosing_春幸閱讀 366評論 0 0
  • 成長的代價我嘗到了 不想再嘗了 太苦了 太痛心了 從今天開始 我會迎接一個全新的自己 放下吧 重新開始 是時候了
    心夢南國閱讀 90評論 0 0