ios - Converter matriz em string JSON em swift




(7)

Dica: Para converter um NSArray contendo objetos compatíveis com JSON em um objeto NSData que contém um documento JSON, use o método apropriado de NSJSONSerialization. JSONObjectWithData não é isso.

Dica 2: você raramente deseja esses dados como uma string; somente para fins de depuração.

Como você converte uma matriz em uma string JSON rapidamente? Basicamente, eu tenho um campo de texto com um botão incorporado. Quando o botão é pressionado, o texto do campo de texto é adicionado ao testArray . Além disso, desejo converter esse array em uma string JSON .

Isto é o que eu tentei:

func addButtonPressed() {
    if goalsTextField.text == "" {
        // Do nothing
    } else {
        testArray.append(goalsTextField.text)
        goalsTableView.reloadData()
        saveDatatoDictionary()
    }
}

func saveDatatoDictionary() {
    data = NSKeyedArchiver.archivedDataWithRootObject(testArray)
    newData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(), error: nil) as? NSData
    string = NSString(data: newData!, encoding: NSUTF8StringEncoding) 
    println(string)
}

Também gostaria de retornar a string JSON usando meu método savetoDictionart() .


Se você já está usando o SwiftyJSON:

https://github.com/SwiftyJSON/SwiftyJSON

Você consegue fazer isso:

// this works with dictionaries too
let paramsDictionary = [
    "title": "foo",
    "description": "bar"
]
let paramsArray = [ "one", "two" ]
let paramsJSON = JSON(paramsArray)
let paramsString = paramsJSON.rawString(encoding: NSUTF8StringEncoding, options: nil)

ATUALIZAÇÃO SWIFT 3

 let paramsJSON = JSON(paramsArray)
 let paramsString = paramsJSON.rawString(String.Encoding.utf8, options: JSONSerialization.WritingOptions.prettyPrinted)!

As strings JSON, que são boas para transporte, não são exibidas com frequência porque é possível JSON codificar um corpo HTTP. Mas um caso de uso potencial para JSON stringify é o Multipart Post, que o AlamoFire agora suporta.


Tal como está, você está convertendo-os em dados, tentando converter os dados em um objeto como JSON (que falha, não é JSON) e convertendo-os em uma string, basicamente você tem várias transformações sem sentido.

Contanto que a matriz contenha apenas valores codificáveis ​​em JSON (sequência, número, dicionário, matriz, zero), você poderá usar apenas NSJSONSerialization para fazer isso.

Em vez disso, basta fazer o array-> dados-> partes da string:

Swift 3/4

let array = [ "one", "two" ]

func json(from object:Any) -> String? {
    guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
        return nil
    }
    return String(data: data, encoding: String.Encoding.utf8)
}

print("\(json(from:array as Any))")

Resposta original

let array = [ "one", "two" ]
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil)
let string = NSString(data: data!, encoding: NSUTF8StringEncoding)

embora você provavelmente não deva usar o desembrulhamento forçado, ele fornece o ponto de partida certo.


Você pode tentar isso.

func convertToJSONString(value: AnyObject) -> String? {
        if JSONSerialization.isValidJSONObject(value) {
            do{
                let data = try JSONSerialization.data(withJSONObject: value, options: [])
                if let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
                    return string as String
                }
            }catch{
            }
        }
        return nil
    }

Para o Swift 3.0, você precisa usar o seguinte:

var postString = ""
    do {
        let data =  try JSONSerialization.data(withJSONObject: self.arrayNParcel, options: .prettyPrinted)
        let string1:String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String

        postString = "arrayData=\(string1)&user_id=\(userId)&markupSrcReport=\(markup)"
    } catch {
        print(error.localizedDescription)
    }
    request.httpBody = postString.data(using: .utf8)

100% de trabalho testado


Para o Swift 4.2, esse código ainda funciona bem

 var mnemonic: [String] =  ["abandon",   "amount",   "liar", "buyer"]
    var myJsonString = ""
    do {
        let data =  try JSONSerialization.data(withJSONObject:mnemonic, options: .prettyPrinted)
       myJsonString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
    } catch {
        print(error.localizedDescription)
    }
    return myJsonString

extension Array where Element: Encodable {
    func asArrayDictionary() throws -> [[String: Any]] {
        var data: [[String: Any]] = []

        for element in self {
            data.append(try element.asDictionary())
        }
        return data
    }
}

extension Encodable {
        func asDictionary() throws -> [String: Any] {
            let data = try JSONEncoder().encode(self)
            guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
                throw NSError()
            }
            return dictionary
        }
}

Se você estiver usando protocolos Codable em seus modelos, essas extensões podem ser úteis para obter representação de dicionário ( Swift 4 )





swift