Невозможно привести данные в словарь - PullRequest
0 голосов
/ 20 июня 2019

У меня есть JSONObject, и я хочу привести его к классу.

Я пытался использовать JSONSerialization.data (withJSONObject: data, options: [] и безуспешно закодировать его как строку .utf8 ....


 socket.on("privateMessage") {data, ack in

            print("privateMessage :\(data[0])");

            guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {return}

Результат:

(lldb) po data
▿ 1 element
  - 0 : {"emisor":105,"receptor":54,"receptor_token":"7ec66175309aac4cbeda0c9936991cfdfcad8445fdcff583524d940c7e0ee4669488675c214823e0","texto":"Dshfljkhdlsafh","updated_at":"2019-06-20 16:38:30","created_at":"2019-06-20 16:38:30","id":10056,"time":"16:38:30"}

(lldb) po jsonData
▿ 282 bytes
  - count : 282
  ▿ pointer : 0x00007f917289f000
    - pointerValue : 140262668627968


Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Это очень необычный формат ответа, из вывода в комментарии это неопределенный массив ([Any]), содержащий одну строку JSON, например:

let json = """
{"emisor":105,"receptor":54,"receptor_token":"6b6295e0b0601146e56ff4a9caec287f0ecc0f385fcfcd758dccd00c6385c558eefc6d6fbe98e977","texto":"Blanca bla","updated_at":"2019-06-21 10:48:22","created_at":"2019-06-21 10:48:22","id":10074,"time":"10:48:22"}
"""

let data : [Any] = [json]

Прежде всего для удобства объявитеstruct

struct Response: Decodable {
    let emisor, receptor, id: Int
    let receptorToken, texto, updatedAt, createdAt, time: String
}

Чтобы проанализировать JSON-проверку, если data является массивом, и если в массиве есть одна строка, преобразуйте его в Data и декодируйте его с Decodable* 1012.*

socket.on("privateMessage") {data, ack in
    if let response = data as? [Any], let jsonString = response.first as? String {
       let jsonData = Data(jsonString.utf8)
       do {
           let decoder = JSONDecoder()
           decoder.keyDecodingStrategy = .convertFromSnakeCase
           let result = try decoder.decode(Response.self, from: jsonData)
           print(result)
       } catch {
           print(error)
       }
   }
}
0 голосов
/ 21 июня 2019

Таким образом, вы можете получить данные любого ключа.Я показываю вам пример получения значения ключаceptor_token.

if let response = jsonData as? [Any] {
    if let responseData = response[0] as? [String:Any] {
       if let receptorToken = responseData["texto"] as? String {
             print(receptorToken)
       }

    }

}
...