AFNetworking从响应中修剪角色

时间:2018-07-27 14:12:46

标签: ios swift afnetworking

我正在使用AFNetworking使用基本身份验证来调用Web服务。问题是我得到了

$ docker inspect --format='{{json .GraphDriver.Data.MergedDir}}' container-id
"/var/lib/docker/overlay2/the-string-you-are-searching-for/merged"

当我允许碎片时,我得到

FAILURE: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

我与我们的Web开发人员进行了交谈,无论出于何种原因,他都在JSON响应的前面加上“ //”,因此在使用JSON之前,我需要对其进行修剪。我的问题是我不确定如何访问响应以对其进行修剪和使用,因为代码会立即转到故障块。

Invalid value around character 0

1 个答案:

答案 0 :(得分:0)

如果使用responseSerializerAFHTTPResponseSerializer设置为manager.responseSerializer = AFHTTPResponseSerializer(),则responseObject应该是(NS)Data对象。

做什么:
获取"//"的值(我们叫它prefixData)。
检查responseObject是否带有前缀。
如果需要,请删除。

let prefixData = "//".data(using: .utf8)!        
//OR let prefixData = Data(bytes: [0x2F, 0x2F])

let responsePrefix = responseObject.subdata(in: Range(0..<2))
if responsePrefix == prefixData {
    let jsonData = responseObject.subdata(in: Range(2..<responseObject.count))
    //You got your JSON to serialize with Codable or JSONSerialization
}

出于逻辑考虑,使用示例代码强制打开并进行静默尝试(尝试?)(不要这样做):

let prefixData = "//".data(using: .utf8)!
print("prefixData from String: \(prefixData as NSData)")

let prefixData2 = Data(bytes: [0x2F, 0x2F])
print("prefixData from Bytes: \(prefixData2 as NSData)")

if prefixData == prefixData2 {
    print("prefixData == prefixData2, use the one you want")
}

let responseObject = "//{\"key\":\"value\"}".data(using: .utf8)!
print("responseObject: \(responseObject as NSData)")

let responsePrefix = responseObject.subdata(in: Range(0..<2))
if responsePrefix == prefixData {
    let jsonData = responseObject.subdata(in: Range(2..<responseObject.count))
    print("jsonData: \(jsonData as NSData)")
    let json = try? JSONSerialization.jsonObject(with: jsonData, options: [])
    print("json: \(json!)")
    let jsonString = String(data: jsonData, encoding: .utf8)
    print("jsonString: \(jsonString!)")
} 

输出:

  

$>来自字符串的prefixData:<2f2f>
  $> prefixData来自字节:<2f2f>
  $> prefixData == prefixData2,请使用所需的
  $> responseObject:<2f2f7b22 6b657922 3a227661 6c756522 7d>
  $> jsonData:<7b226b65 79223a22 76616c75 65227d>
  $> json:可选({
          键=值;
  })
  $> jsonString:{“键”:“值”}