Swift:可编码结构始终为零
Swift : Codable Struct Always Nil
我有以下JSON响应
{
"status_code": 1000,
"data": {
"user_id": 1000,
"bid": "E5PPD5E3",
"province": 0,
"location": "123,123"
},
"message": "Verified"
}
这是我的结构
struct Basicresponse : Codable{
var statusCode : Int!
var message : String?
var data : data?
enum CodingKeys: String, CodingKey {
case statusCode = "status_code"
}
}
struct data : Codable{
var province : Int
var userID : Int
var location : String
var bid : String
enum CodingKeys: String, CodingKey {
case province, location , bid
case userID = "user_id"
}
}
和
do {
let jsonData = try JSONDecoder().decode(Basicresponse.self, from: data!)
if(jsonData.statusCode == 1000){
print(jsonData)
}else{
self.alert.show(target: self.view, message: jsonData.message!)
}
}
catch let jsonerr {
print("error serrializing error",jsonerr)
}
但是结果如下,
Basicresponse(statusCode: Optional(2000), message: nil, data: nil)
我不知道为什么数据和消息总是零?!我用 Post man 尝试了终点并且它工作正常但在我的应用程序中它总是零,我在这里遗漏了什么吗?
任何帮助将不胜感激
问题是您从 CodingKeys
中排除了 message
和 data
。但是你可以这样添加它们:
struct Basicresponse: Codable {
var statusCode : Int!
var message : String?
var data : data?
enum CodingKeys: String, CodingKey {
case statusCode = "status_code"
case message, data
}
}
另一种选择是根本不提供 CodingKeys
并告诉您的解码器为您进行蛇形转换。
let data = """
{
"status_code": 1000,
"data": {
"user_id": 1000,
"bid": "E5PPD5E3",
"province": 0,
"location": "123,123"
},
"message": "Verified"
}
""".data(using: .utf8)!
struct BasicResponse: Codable {
var statusCode: Int
var message: String?
var data: Bid?
}
struct Bid: Codable {
var province: Int
var userId: Int
var location: String
var bid: String
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let jsonData = try decoder.decode(BasicResponse.self, from: data)
if jsonData.statusCode == 1000 {
print(jsonData)
} else {
print(jsonData.message ?? "No message")
}
} catch let jsonError {
print("error serializing error", jsonError)
}
希望您不介意,但我已将您的 data
类型重命名为 Bid
(因为 data
不符合标准 class以大写字母开头的命名约定很容易与现有的 Data
类型混淆)。我不知道 Bid
是不是正确的名称,所以请使用您认为合适的任何名称,但希望它能说明这个想法。
我有以下JSON响应
{
"status_code": 1000,
"data": {
"user_id": 1000,
"bid": "E5PPD5E3",
"province": 0,
"location": "123,123"
},
"message": "Verified"
}
这是我的结构
struct Basicresponse : Codable{
var statusCode : Int!
var message : String?
var data : data?
enum CodingKeys: String, CodingKey {
case statusCode = "status_code"
}
}
struct data : Codable{
var province : Int
var userID : Int
var location : String
var bid : String
enum CodingKeys: String, CodingKey {
case province, location , bid
case userID = "user_id"
}
}
和
do {
let jsonData = try JSONDecoder().decode(Basicresponse.self, from: data!)
if(jsonData.statusCode == 1000){
print(jsonData)
}else{
self.alert.show(target: self.view, message: jsonData.message!)
}
}
catch let jsonerr {
print("error serrializing error",jsonerr)
}
但是结果如下,
Basicresponse(statusCode: Optional(2000), message: nil, data: nil)
我不知道为什么数据和消息总是零?!我用 Post man 尝试了终点并且它工作正常但在我的应用程序中它总是零,我在这里遗漏了什么吗?
任何帮助将不胜感激
问题是您从 CodingKeys
中排除了 message
和 data
。但是你可以这样添加它们:
struct Basicresponse: Codable {
var statusCode : Int!
var message : String?
var data : data?
enum CodingKeys: String, CodingKey {
case statusCode = "status_code"
case message, data
}
}
另一种选择是根本不提供 CodingKeys
并告诉您的解码器为您进行蛇形转换。
let data = """
{
"status_code": 1000,
"data": {
"user_id": 1000,
"bid": "E5PPD5E3",
"province": 0,
"location": "123,123"
},
"message": "Verified"
}
""".data(using: .utf8)!
struct BasicResponse: Codable {
var statusCode: Int
var message: String?
var data: Bid?
}
struct Bid: Codable {
var province: Int
var userId: Int
var location: String
var bid: String
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let jsonData = try decoder.decode(BasicResponse.self, from: data)
if jsonData.statusCode == 1000 {
print(jsonData)
} else {
print(jsonData.message ?? "No message")
}
} catch let jsonError {
print("error serializing error", jsonError)
}
希望您不介意,但我已将您的 data
类型重命名为 Bid
(因为 data
不符合标准 class以大写字母开头的命名约定很容易与现有的 Data
类型混淆)。我不知道 Bid
是不是正确的名称,所以请使用您认为合适的任何名称,但希望它能说明这个想法。