Преобразование JSON в NSData и NSData в JSON в Swift
У меня возникают проблемы с преобразованием элемента JSON в NSData и переменной NSData обратно в JSON в Swift.
Во-первых, я хотел бы извлечь элемент encryptedData из следующих данных JSON:
{
"transactionID" : 12345,
"encryptedData" : [-67,51,-38,61,-72,102,48]
}
в переменную encryptedData NSData, но, похоже, она не может это сделать. Я использую SwiftyJSON для анализа JSON следующим образом:
let list: Array<JSON> = json["encryptedData"].arrayValue!
Но это дает мне массив ScalarNumber, который я не знаю, как хранить в объекте NSData.
Во-вторых, я хотел бы сгенерировать JSON из одного и того же объекта NSData:
let jsonObject = [
"transactionID" : 12345,
"encryptedData" : encryptedData
]
Но объект NSData 'encryptedData' не преобразуется в [-67,51, -38,61, -72,102,48], он просто сбрасывает строку JSON.
Любые идеи?
Спасибо
Ответы
Ответ 1
В 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)!)
}
Ответ 2
Вот код для преобразования между JSON и NSData в swift 2.0 (адаптирован из ответа 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;
}
Ответ 3
Я не имею представления о SwiftyJSON. Я использую следующий фрагмент кода для преобразования между json и nsdatap >
// 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)
}
Ответ 4
@Sunil Targe - это версия Swift3. Надеюсь это поможет. (Адаптировано из ответа Циприана Рарау)
Преобразование данных в 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;
}
Ответ 5
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;
}
Ответ 6
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()
}
}