【问题标题】:Converting JSON to NSData, and NSData to JSON in Swift在 Swift 中将 JSON 转换为 NSData,以及将 NSData 转换为 JSON
【发布时间】:2015-01-06 13:49:21
【问题描述】:

在 Swift 中将 JSON 元素转换为 NSData 以及将 NSData 变量转换回 JSON 时遇到问题。

首先,我想提取以下 JSON 数据的 encryptedData 元素:

{
    "transactionID" : 12345,
    "encryptedData" : [-67,51,-38,61,-72,102,48]
}

进入 NSData encryptedData 变量,但似乎无法做到这一点。我正在使用SwiftyJSON 来解析JSON,如下所示:

let list: Array<JSON> = json["encryptedData"].arrayValue!

但这给了我一个 ScalarNumber 数组,我不知道如何将其存储到 NSData 对象中。

其次,我想从同一个 NSData 对象生成 JSON

let jsonObject = [
    "transactionID" : 12345,
    "encryptedData" : encryptedData
]

但是 NSData encryptedData 对象没有被转换为 [-67,51,-38,61,-72,102,48],它似乎只是使 JSON 字符串无效。

有什么想法吗?

【问题讨论】:

    标签: json xcode swift nsdata


    【解决方案1】:

    我不知道 SwiftyJSON。我使用以下代码 sn-p 在 json 和 nsdata 之间进行转换

    // Convert from NSData to json object
    public class func nsdataToJSON(data: NSData) -> AnyObject? {
        return NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil)
    }
    
    // Convert from JSON to nsdata
    public class func jsonToNSData(json: AnyObject) -> NSData?{
        return NSJSONSerialization.dataWithJSONObject(json, options: .allZeros, error: nil)
    }
    

    【讨论】:

    • 感谢您的回复硕,我不知道如何使用您的解决方案,即如何传递密钥'encryptedData'来识别我想要取回的数据?感谢您的帮助!
    【解决方案2】:

    在 SwiftyJSON 中你可以使用 rawData 方法来获取 NSData:

    if let encryptedData:NSData = json["encryptedData"].rawData() {
        NSLog(NSString(data: encryptedData, encoding: NSUTF8StringEncoding)!)
    }
    

    要根据需要生成 JSON,您应该将数据转换为数组对象:

    if let encryptedDataArray = JSON(data: encryptedData).arrayObject {
        let jsonObject:JSON = [
            "transactionID" : 12345,
            "encryptedData" : encryptedDataArray
        ]
        NSLog(NSString(data: jsonObject.rawData()!, encoding: NSUTF8StringEncoding)!)
    }
    

    【讨论】:

    • 您好 Tish,非常感谢您的回复。不幸的是 SwiftyJSON 不支持 'rawValue()'。我本来希望 SwiftyJSON 支持这样的东西。
    • 它根据文档进行。但是 rawValue 不是一种方法,它是一个属性。与您在我的回复中看到的 rawData() 方法不同。您可以在 GitHub 文档中找到示例:github.com/SwiftyJSON/SwiftyJSON#raw-object
    【解决方案3】:

    这是 swift 2.0 中 JSON 和 NSData 之间转换的代码(改编自 Shuo 的回答)

    // Convert from NSData to json object
    func nsdataToJSON(data: NSData) -> AnyObject? {
        do {
            return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
        } catch let myJSONError {
            print(myJSONError)
        }
        return nil
    }
    
    // Convert from JSON to nsdata
    func jsonToNSData(json: AnyObject) -> NSData?{
        do {
            return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
        } catch let myJSONError {
            print(myJSONError)
        }
        return nil;
    }
    

    【讨论】:

    • @SunilTarge Xcode 会为您完成转换工作,如果您遵循警告,那么您也可以快速了解 Swift 2 和 3 之间的差异。
    • 但是每当我解决警告时它都会出错。 @Leon
    • @Bhumesh-Purohit 我们现在进入 Swift 4,您是否要从 2 迁移到 4?您需要发布一些代码和随后的错误。
    • 真的很有用!此链接developer.apple.com/swift/blog/?id=37 解释了如何探索创建的 JSON 对象
    【解决方案4】:

    @Sunil Targe 这里是 Swift3 版本。希望这可以帮助。 (改编自 Ciprian Rarau 的回答)

    将数据转换为 JSON

    func dataToJSON(data: Data) -> Any? {
       do {
           return try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
       } catch let myJSONError {
           print(myJSONError)
       }
       return nil
    }
    

    从 JSON 转换为数据

    func jsonToData(json: Any) -> Data? {
        do {
            return try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted)
        } catch let myJSONError {
            print(myJSONError)
        }
        return nil;
    }
    

    【讨论】:

    • 谢谢。请注意,这可以在一行代码中完成,通过返回 try?(对于那些不需要打印 myJSONError 的人)。
    【解决方案5】:
    class ViewController: UIViewController {
    
        let requestURL : NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")!
        let session = URLSession.shared
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            fetchData()
        }
    
        func fetchData()
        {
            let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
            let task = session.dataTask(with: urlRequest as URLRequest) { (data, response, error) -> Void in
    
                let httpResponse = response as! HTTPURLResponse
                let statusCode = httpResponse.statusCode
    
                if(statusCode == 200)
                {
                    do {
                        let jsonResponse = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
                        print(jsonResponse as! NSDictionary)
                    }
                    catch let error
                    {
                        print(error)
                    }
                }
            }
            task.resume()
    
        }
    }
    

    【讨论】:

    • 我讨厌人们看不起这样的帖子。我一直在搜索,但没有找到任何人会展示如何在不解码/编码的情况下解析数据。谢谢!
    【解决方案6】:

    适合我的 Swift 4:

    // Convert from JSON to nsdata
    func jsonToNSData(json: AnyObject) -> NSData?{
        do {
            return try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) as NSData
        } catch let myJSONError {
            print(myJSONError)
        }
        return nil;
    }
    

    【讨论】:

      【解决方案7】:

      Swift 5 和 SwiftyJSON 适合我:

      import SwiftyJSON
      
      func getDataFrom(JSON json: JSON) -> Data? {
          do {
              return try json.rawData(options: .prettyPrinted)
          } catch _ {
              return nil
          }
      }
      
      func getJSONFrom(Data data: Data) -> JSON? {
          do {
              return try JSON(data: data, options: .mutableContainers)
          } catch _ {
              return nil
          }
          
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多