Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON解码无法按预期工作swift 4_Json_Swift_Jsondecoder - Fatal编程技术网

JSON解码无法按预期工作swift 4

JSON解码无法按预期工作swift 4,json,swift,jsondecoder,Json,Swift,Jsondecoder,如果我想解码我的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

如果我想解码我的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是 {用户:test,消息:Hello welcome,状态:admin,纬度:0,经度:0}

返回聊天信息用户:test,信息:Hello welcome,状态:admin,纬度:0.0,经度:0.0

但是如果有更多的消息,例如:[用户:用户1,消息:你好欢迎,状态:管理员,纬度:0,经度:0},{用户:用户2,消息:你好欢迎,状态:管理员,纬度:0,经度:0}],我无法让它工作。 其返回的typeMismatchSwift.Dictionary,Swift.DecodingError.ContextcodingPath:[],debugDescription:应解码字典,但找到了一个数组,underlineError:nil

我试过使用chatMessages.self,但没有达到预期效果。 我做错了什么


提前谢谢。

答案很简单, 您必须使用以下选项:

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

let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
在loadChats函数中。
因为您有NSDictionary数组。

您可以在initdecoder中检测并处理它,但简单的解决方案是这样做

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

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

此外,我认为最好将后端更改为返回数组anway,即使只有一条消息

也不要使用此消息,内容可能是字典或数组,因此这两种情况仍然存在。响应必须是固定结构。所以你根据它来解码。