json - Swift 解析 json 读为 nil

标签 json swift parsing null

所以我尝试用 jsondecoder 解析,当我在日志菜单中看到时,json 中的所有数据都是 nil。虽然我检查 postman 的json都有数据

所以这是我要解析的 json(*我只想解析行):

{
    "  user": {
    "command": "SELECT",
    "rowCount": 1,
    "oid": null,
    "rows": [
        {
            "user_id": 193,
            "u_name": "Gunawan Wibisono",
            "email": "gunwibi89@gmail.com",
            "div_name": "Design Aplication & Infrastructure",
            "url": "2"
        }
    ],
    "fields": [
        {
            "name": "user_id",
            "tableID": 1656774,
            "columnID": 1,
            "dataTypeID": 23,
            "dataTypeSize": 4,
            "dataTypeModifier": -1,
            "format": "text"
        },
        {
            "name": "u_name",
            "tableID": 1656774,
            "columnID": 2,
            "dataTypeID": 1043,
            "dataTypeSize": -1,
            "dataTypeModifier": 54,
            "format": "text"
        },
        {
            "name": "email",
            "tableID": 1656774,
            "columnID": 3,
            "dataTypeID": 1043,
            "dataTypeSize": -1,
            "dataTypeModifier": 259,
            "format": "text"
        },
        {
            "name": "div_name",
            "tableID": 1656724,
            "columnID": 2,
            "dataTypeID": 1043,
            "dataTypeSize": -1,
            "dataTypeModifier": 259,
            "format": "text"
        },
        {
            "name": "url",
            "tableID": 1656774,
            "columnID": 9,
            "dataTypeID": 1043,
            "dataTypeSize": -1,
            "dataTypeModifier": 259,
            "format": "text"
        }
    ],
    "_parsers": [
        null,
        null,
        null,
        null,
        null
    ],
    "_types": {
        "_types": {
            "arrayParser": {}
        },
        "text": {},
        "binary": {}
    },
    "RowCtor": null,
    "rowAsArray": false
   },
     "status": 1
 }

这是代码:

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(command: nil, rowCount: nil, oid: nil, rows: nil)”

知道我哪里做错了吗?

最佳答案

您的Codable 结构是错误的。您应该引用一些教程。根据您的回复,这是 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 您的用户 key 在前面有额外的空间,例如 "user",您的 API 开发人员应该尽可能修复它。

现在解码:

do{
    let decodeResponse = try JSONDecoder().decode(UserResponse.self, from: data)
    print("this is the json\(decodeResponse.user)")
}catch{
    print(error)
}

关于json - Swift 解析 json 读为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58334022/

相关文章:

json - 如何解析 APEX Web 服务请求正文中的 JSON 数组

c# - 在 asp.mvc 和 json 中将枚举作为字符串返回

java - 在 String Java 中搜索并替换 SSN 和/或信用卡

javascript - 防止 AngularJS $http promise 返回缓存的 JSON 数据

arrays - 基于多个属性在 Swift 中过滤数组

ios - Swift UIButton 扩展动画覆盖

html - C 语言的服务器实现

ios - CLLocationManager AuthorizationStatus 回调?

Java Byte.parseByte() 错误

xml - 如何使用单个标签解析XML响应