在swift中为Web服务的JSON字符串添加了反斜杠“\”

时间:2016-07-18 11:46:15

标签: ios json swift web-services

在我的项目中,我需要在Web服务API调用中发送JSON对象。我已经从数组中转换了JSON。

do {

       let theJSONData = try NSJSONSerialization.dataWithJSONObject(
                        param ,
                        options: NSJSONWritingOptions(rawValue: 0))

       var theJSONText : String = String(data: theJSONData,
                        encoding: NSASCIIStringEncoding)!

       print(theJSONText)

       theJSONText = theJSONText.stringByReplacingOccurrencesOfString("\\", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

       print(theJSONText)

       let newParam = ["ESignData":theJSONText]


} catch let error as NSError {
                    print(error)
                }

正确打印字符串

{"EntNum":"47","JobNo":"1737753","ClientID":"100","HospNo":"1","QAReason":"","DoctorNo":"1694","Action":"Sign"}
{"EntNum":"47","JobNo":"1737753","ClientID":"100","HospNo":"1","QAReason":"","DoctorNo":"1694","Action":"Sign"}

现在,当我尝试在API调用中发送此newParam字典时,它在JSON字符串的字符串参数中包含“\”。

WebService.PostURL(mainLink, methodname: ESIGNTHISDOC, param: newParam, userName: AUTH_USERNAME, password: AUTH_PWD, CompletionHandler: { (success, response) in
})

在那个Web服务方法中,我有打印参数。

Param =  {
    ESignData = "{\"EntNum\":\"47\",\"JobNo\":\"1737753\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}";
}

现在我知道这在iOS中是显而易见的,因为“在字符串中。现在问题是在Android应用程序中有很多API工作,并且API开发人员不想根据我们更新他的代码。

我知道发生此问题是因为在字典中添加JSON字符串作为参数。但是我没有正确的理由,所以如果有任何证据也有助于我说服他。

在iOS中没有反斜杠转换JSON字符串的任何解决方案?如果可能的话,我需要从我身边修好。任何帮助将不胜感激。

编辑:

在服务器端,它需要像

ESignData = {"EntNum":"47","JobNo":"1737753","ClientID":"100","HospNo":"1","QAReason":"","DoctorNo":"1694","Action":"Sign"}

如果我在POSTMAN中传递此参数而不是成功消息。但不是我们的对象中带有“\”。

编辑2:

现在打印newParam字典:

print(newParam)
print("-------------------------")
print(newParam["ESignData"])

并记录:

["ESignData": "{\"EntNum\":\"47\",\"JobNo\":\"1737754\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}"]
-------------------------
Optional("{\"EntNum\":\"47\",\"JobNo\":\"1737754\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}")

通过调试:

Printing description of newParam:
▿ 1 elements
  ▿ [0] : 2 elements
    - .0 : "ESignData"
    - .1 : "{\"EntNum\":\"47\",\"JobNo\":\"1737754\",\"ClientID\":\"100\",\"HospNo\":\"1\",\"QAReason\":\"\",\"DoctorNo\":\"1694\",\"Action\":\"Sign\"}"

所以它表明它在我们的字典中。所有“都加入了\。

1 个答案:

答案 0 :(得分:1)

我今天遇到了这个问题。对我来说,似乎任何NSURLRequest的默认编码都是字符串。因此,在创建字典请求和解析它的服务器之间,会出现反斜杠,服务器的负载会出现问题。

我通过设置内容类型标题明确声明我的有效负载是JSON来解决问题。

    [authRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

现在,当我从字典创建JSON数据时,不会出现反斜杠,服务器也能正确解析所有内容。

以下代码段完整性:

   NSMutableURLRequest *authRequest = [[[NSURLRequest alloc] initWithURL:authURL] mutableCopy];
[authRequest setHTTPMethod:@"POST"];
NSURLSession *session = [NSURLSession sharedSession];

[authRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSDictionary *bodyDictionary = @{@"User_Name": user, @"Password_Hash": password};

if ([NSJSONSerialization isValidJSONObject:bodyDictionary]) {
    NSError *error;
    NSData *bodyData = [NSJSONSerialization dataWithJSONObject:bodyDictionary options:0 error:&error];
    if (!error) {
        [authRequest setHTTPBody:bodyData];
    } else {
        NSLog(@"Unable to convert to JSON DATA %@", error.localizedDescription);
    }
}