Swift解析json读取为nil
因此,我尝试使用jsondecoder进行解析,当我在日志菜单中看到时,json中的所有数据都是零。虽然我签入的json邮递员都有数据 下面是我要解析的json(*我只想解析行): 代码如下:Swift解析json读取为nil,json,swift,parsing,null,Json,Swift,Parsing,Null,因此,我尝试使用jsondecoder进行解析,当我在日志菜单中看到时,json中的所有数据都是零。虽然我签入的json邮递员都有数据 下面是我要解析的json(*我只想解析行): 代码如下: struct User : Codable { let command : String? let rowCount : Int? let oid : Int? let rows : [Rowss]? } struct Rowss : Codable { let user_id: Int? let u
struct User : Codable {
let command : String?
let rowCount : Int?
let oid : Int?
let rows : [Rowss]?
}
struct Rowss : Codable {
let user_id: Int?
let u_name : String?
let email : String?
let div_name: String?
let url : String?
enum Codingkeys : String, CodingKey {
case user_id = "user_id"
case u_name = "u_name"
case email = "email"
case div_name = "div_name"
case url = "url"
}
}
func Json() {
let user = UserName.text
let pass = Password.text
let json = "http://ratings.immobispsa.com/getslogs/\(user!)/\(pass!)"
guard let myUrl = URL(string: json) else { return }
URLSession.shared.dataTask(with: myUrl) { (data, response, error) in
guard let data = data else {return}
do{
let user = try JSONDecoder().decode(User.self, from: data)
print("this is the json\(user)")
}catch{
print(error)
}
}.resume()
这是生成后的日志菜单:
这是jsonUser(命令:nil,行数:nil,oid:nil,行数:nil)
你知道我哪里做错了吗?你的
Codable
结构错了。你应该参考一些教程。根据您的回答,以下是可编码结构
:
struct UserResponse: Codable {
let status: Int
let user: User
private enum CodingKeys: String, CodingKey {
case status
case user = " user"
}
}
struct User: Codable {
let command: String?
let rowCount: Int?
let oid: Int?
let rowCtor: Int?
let rowAsArray: Bool?
let rows: [Rows]?
let fields: [Fields]?
let parsers: [Parsers]?
let types: Type?
private enum CodingKeys: String, CodingKey {
case command
case rowCount
case oid
case rowCtor = "RowCtor"
case rowAsArray
case rows
case fields
case parsers = "_parsers"
case types = "_types"
}
}
struct Rows: Codable {
let userId: Int
let uName: String
let email: String
let divName: String
let url: String
private enum CodingKeys: String, CodingKey {
case userId = "user_id"
case uName = "u_name"
case email
case divName = "div_name"
case url
}
}
struct Fields: Codable {
let name: String
let tableID: Int
let columnID: Int
let datatypeID: Int?
let dataTypeSize: Int
let dataTypeModifier: Int
let format: String
private enum CodingKeys: String, CodingKey {
case name
case tableID
case columnID
case datatypeID
case dataTypeSize
case dataTypeModifier
case format
}
}
struct Parsers: Codable {
}
struct Types: Codable {
let types: Type?
let text: Text?
let binary: Binary?
private enum CodingKeys: String, CodingKey {
case types = "_types"
case text
case binary
}
}
struct Type: Codable {
}
struct Text: Codable {
}
struct Binary: Codable {
}
如果任何值都可以是null
,那么只将其标记为可选(?)
,否则不要
,并且在JSON
中,您的用户密钥前面有额外的空间,如“user”
,如果可能,您的API
开发人员应该修复它
现在解码它:
do{
let decodeResponse = try JSONDecoder().decode(UserResponse.self, from: data)
print("this is the json\(decodeResponse.user)")
}catch{
print(error)
}
您的
Codable
结构错误。你应该参考一些教程。根据您的回答,以下是可编码结构
:
struct UserResponse: Codable {
let status: Int
let user: User
private enum CodingKeys: String, CodingKey {
case status
case user = " user"
}
}
struct User: Codable {
let command: String?
let rowCount: Int?
let oid: Int?
let rowCtor: Int?
let rowAsArray: Bool?
let rows: [Rows]?
let fields: [Fields]?
let parsers: [Parsers]?
let types: Type?
private enum CodingKeys: String, CodingKey {
case command
case rowCount
case oid
case rowCtor = "RowCtor"
case rowAsArray
case rows
case fields
case parsers = "_parsers"
case types = "_types"
}
}
struct Rows: Codable {
let userId: Int
let uName: String
let email: String
let divName: String
let url: String
private enum CodingKeys: String, CodingKey {
case userId = "user_id"
case uName = "u_name"
case email
case divName = "div_name"
case url
}
}
struct Fields: Codable {
let name: String
let tableID: Int
let columnID: Int
let datatypeID: Int?
let dataTypeSize: Int
let dataTypeModifier: Int
let format: String
private enum CodingKeys: String, CodingKey {
case name
case tableID
case columnID
case datatypeID
case dataTypeSize
case dataTypeModifier
case format
}
}
struct Parsers: Codable {
}
struct Types: Codable {
let types: Type?
let text: Text?
let binary: Binary?
private enum CodingKeys: String, CodingKey {
case types = "_types"
case text
case binary
}
}
struct Type: Codable {
}
struct Text: Codable {
}
struct Binary: Codable {
}
如果任何值都可以是null
,那么只将其标记为可选(?)
,否则不要
,并且在JSON
中,您的用户密钥前面有额外的空间,如“user”
,如果可能,您的API
开发人员应该修复它
现在解码它:
do{
let decodeResponse = try JSONDecoder().decode(UserResponse.self, from: data)
print("this is the json\(decodeResponse.user)")
}catch{
print(error)
}
您的用户可编码在哪里?你能粘贴所有可编码的结构吗?看看它可以帮助你解析JSON,并提供各种选项,你可以根据你的needs@SharadChauhan我已经更新了struct@SahilManchanda我将尝试使用它,感谢tipThis。这是一个很好的例子,说明了为什么默认情况下不应该将属性声明为可选属性。如果它们不是可选的,那么解码器将生成一个错误,这将帮助您意识到您的结构不正确,也许您可以自己修复它。您的用户可编码在哪里?你能粘贴所有可编码的结构吗?看看它可以帮助你解析JSON,并提供各种选项,你可以根据你的needs@SharadChauhan我已经更新了struct@SahilManchanda我将尝试使用它,感谢tipThis。这是一个很好的例子,说明了为什么默认情况下不应该将属性声明为可选属性。如果这些属性不是可选的,那么解码器将生成一个错误,帮助您意识到结构不正确,也许您可以自己修复。您不应该将所有属性设置为可选的,只有您真正确定的属性可以为零。@JoakimDanielson同意,这就是为什么我添加了这一点,因为我不知道答案。但由于存在空值,它们可能都是空值,也可能不是空值。所以我假设。谢谢你的回答,对不起,我在SWIFT还是新手。你不应该把所有属性都设置为可选的,只有你真正确定的属性可以为零。@JoakimDanielson同意,这就是为什么我添加了这一点,因为我不知道答案。但由于存在空值,它们可能都是空值,也可能不是空值。谢谢你的回答,对不起,我在斯威夫特还是新来的