【问题标题】:iOS: Unable to convert Json String to Array in swift?iOS:无法快速将 Json 字符串转换为数组?
【发布时间】:2018-01-29 09:25:24
【问题描述】:

在我的项目中,我想将 Json 字符串从服务器转换为数组但无法转换,但是当我硬编码(直接给出特定的 json 字符串)时,json 字符串意味着将被转换。请帮我找出问题..

这里我给出了我尝试过的代码。

var params = NSMutableDictionary()
    params = [
        "inspectionLogId": inspectionLogIdStr
    ]
    let manager = AFHTTPSessionManager()
    manager.requestSerializer = AFJSONRequestSerializer()
    manager.responseSerializer = AFHTTPResponseSerializer()
    manager.responseSerializer.acceptableContentTypes = NSSet(array: ["text/plain", "text/html", "application/json"]) as Set<NSObject> as Set<NSObject>! as! Set<String>?
    manager.requestSerializer.setValue("", forHTTPHeaderField: "apptoken")
    manager.requestSerializer.setValue(strAppToken, forHTTPHeaderField: "token")
    let urlString:NSString = NSString(format: "%@%@", ApiConstantFile().baseUrlProperty,ApiConstantFile().getTemplateDataUrl)
    print(urlString)
    manager.get(urlString as String, parameters: params, progress: nil, success: {
        (operation, responseObject) in
        self.stopAnimation()

        let jsonstring = String(data: responseObject! as! Data, encoding: String.Encoding.utf8)
        print("jsonstring is:, \(jsonstring!)")

        let data = jsonstring!.data(using: .utf8)!
        print(data)
        do {
            if (try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]) != nil {
                let jsonArray = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as! [Dictionary<String,Any>]
                print(jsonArray)
            } else {
                print("bad json")
            }
        } catch {
            print(error)
        }

    }, failure: {
        (operation, error) in
        self.stopAnimation()
        print(error)
        self.alert(message: error.localizedDescription)
    })

当我打印 json 字符串时,意味着它们显示为字符串:

"[{\"propertyId\":\"1\",\"inspectionTemplateId\":1118,\"value\":[{\"widgetControllerId\":141,\"value\":\"Flood Summary Name\"},{\"widgetControllerId\":142,\"value\":\"Did the property flood?\"},{\"widgetControllerId\":143,\"value\":\"no\"}]}]"

但是当我直接给出字符串时,意味着它会转换为数组。

let jsonstring = "[{\"propertyId\":\"1\",\"inspectionTemplateId\":1118,\"value\":[{\"widgetControllerId\":141,\"value\":\"Flood Summary Name\"},{\"widgetControllerId\":142,\"value\":\"Did the property flood?\"},{\"widgetControllerId\":143,\"value\":\"no\"}]}]"

【问题讨论】:

  • 从哪里获得responseObject
  • 为什么要复制? stackoverflow.com/questions/48495999/… ?正如@vadian 在另一个问题中所建议的那样,您能给我们data 的值吗?像print("data: \(data as NSData)") 这样的东西?例如可能存在隐藏值(不可见字符)
  • 这不是重复的,这与那个不同。请不要重复。@Larme
  • 为什么不利用AFNetworking 并使用manager.responseSerializer = AFJSONResponseSerializer() 而不是manager.responseSerializer = AFHTTPResponseSerializer()
  • 不相关,但NSSet(array: ["text/plain", "text/html", "application/json"]) as Set&lt;NSObject&gt; as Set&lt;NSObject&gt;! as! Set&lt;String&gt;? 太可怕了。为什么不简单地Set(["text/plain", "text/html", "application/json"])?为什么NSMutableDictionary 是一个im可变常量?

标签: ios swift


【解决方案1】:

只需将AFHTTPResponseSerializer 替换为AFJSONResponseSerializer,如下所示:

var params = NSMutableDictionary()
params = [
    "inspectionLogId": inspectionLogIdStr
]
let manager = AFHTTPSessionManager()
manager.requestSerializer = AFJSONRequestSerializer()
manager.responseSerializer = AFJSONResponseSerializer()
manager.requestSerializer.setValue("", forHTTPHeaderField: "apptoken")
manager.requestSerializer.setValue(strAppToken, forHTTPHeaderField: "token")
let urlString:NSString = NSString(format: "%@%@", ApiConstantFile().baseUrlProperty,ApiConstantFile().getTemplateDataUrl)
print(urlString)
manager.get(urlString as String, parameters: params, progress: nil, success: {
    (operation, responseObject) in
    self.stopAnimation()
    print(responseObject)

}, failure: {
    (operation, error) in
    self.stopAnimation()
    print(error)
    self.alert(message: error.localizedDescription)
})

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多