JSON Decode не работает должным образом Swift 4

Если я хочу расшифровать мой JSON, происходит что-то странное.

Вот структуры

struct chatMessages : Codable {
    var message: [chatMessage]
}

struct chatMessage : Codable {
    var user: String
    var message: String
    var status: String
    var latitude: Double
    var longitude: Double

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        user = try values.decode(String.self, forKey: .user)
        message = try values.decode(String.self, forKey: .message)
        status = try values.decode(String.self, forKey: .status)
        latitude = try values.decodeIfPresent(Double.self, forKey: .latitude) ?? 0.0
        longitude = try values.decodeIfPresent(Double.self, forKey: .longitude) ?? 0.0
    }
}

И здесь функция

   func loadChats() {
        print("Try to load chats...")
        do {
        let jsonData = W.getDataAsData(chatURL)
            print(jsonData)
            print(String.init(data: jsonData, encoding: .utf8)!)
            print("-----------")
            let jsonDecoder = JSONDecoder()
            let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
            print(chatMessage1)
        }
        catch {
            print("Something went wrong")
            print("\(error)")
        }
    }

если возвращенный JSON{"user":"test","message":"Hello welcome","status":"admin","latitude":0,"longitude":0},

его возвращение chatMessage(user: "test", message: "Hello welcome", status: "admin", latitude: 0.0, longitude: 0.0)

но если есть больше сообщений, например, [{"user":"user1","message":"Hello welcome","status":"admin","latitude":0,"longitude":0},{"user":"user2","message":"Hello welcome","status":"admin","latitude":0,"longitude":0}] Я не могу заставить его работать. Его возвращение typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

Я пробовал с chatMessages.self но это не так, как ожидалось. Что я делаю неправильно?

Заранее спасибо.

2 ответа

Решение

Вы можете обнаружить это внутри init(decoder) и справиться с этим, но простое решение состоит в том, чтобы сделать это

 do {
       let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
   }
 catch {

    do {
        let chatMessage1 = try jsonDecoder.decode([chatMessage].self, from: jsonData)
     }
     catch {
        print(error)
      }
}

Кроме того, я думаю, что лучше всего изменить свой бэкэнд, чтобы он возвращал массив, даже если есть только одно сообщение

Ответ очень прост, вы должны использовать это:

let chatMessage1 = try jsonDecoder.decode([chatMessage].self, from: jsonData)

вместо этого:

let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)

в функции loadChats(). потому что у вас есть массив NSDictionary.

Другие вопросы по тегам