【问题标题】:backslashes "\" added in JSON string for web service in swift在 swift 中为 Web 服务的 JSON 字符串中添加了反斜杠“\”
【发布时间】:2016-11-21 00:20:00
【问题描述】:

在我的项目中,我需要在 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
})

在那个网络服务方法中我有打印参数。

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

现在我知道这在 iOS 中很明显,因为字符串中的 "。现在的问题是有很多 API 在 android 应用程序中工作,并且 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\"}"

所以它表明它在我们的字典中。所有的 " 都由 \ 连接。

【问题讨论】:

  • 我不知道你是如何在服务器端打印参数的,但是看到封闭的"s,看似两个字符序列\"将代表一个字符@987654333 @。许多调试输出使用这种“类似字符串文字”的符号。我相信你的参数已经成功发送到服务器了。
  • @OOPer 这是在我们这边而不是在服务器端打印,我们只是收到失败响应,因为他们无法获取所需的参数。
  • 那么,原因不是反斜杠。如果您的 newParam 对 API 有效,请检查 API 参考。
  • 让我编辑问题。
  • 您在帖子的Params = 部分显示的代码采用NSDictionary 的类似plist 的格式进行格式化。那些 \ 不会发送到服务器。

标签: ios json swift web-services


【解决方案1】:

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

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

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

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

为了完整起见,下面的代码 sn-p:

   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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多