【问题标题】:Swift parsing json read as nilSwift解析json读取为nil
【发布时间】:2026-02-16 01:15:01
【问题描述】:

所以我尝试使用 jsondecoder 进行解析,当我在日志菜单中看到时,json 中的所有数据都为零。虽然我签入邮递员的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 结构吗?
  • 查看app.quicktype.io,它可以帮助您解析 JSON 并提供各种选项,您可以根据需要自定义
  • @Sharad Chauhan 我已经更新了结构
  • @SahilManchanda 我会尝试使用它,谢谢您的提示
  • 这是一个很好的例子,为什么你应该默认将你的属性声明为可选。如果它们不是可选的,那么解码器会产生一个错误,这会帮助你意识到你的结构是不正确的,也许你可以自己解决这个问题。

标签: json swift parsing null


【解决方案1】:

您的Codable 结构错误。您应该参考一些教程。根据您的回复,这是Codable structure

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,则仅将其标记为optional (?),否则为don't,并且在JSON 中,您的用户密钥在前面有额外的空间,例如" user",您的API如果可能,开发人员应该修复它。

现在解码:

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

【讨论】:

  • 你不应该将所有属性都设置为可选,只有你确定的可以为nil。
  • @JoakimDanielson 同意,这就是为什么我添加了这一点,因为我不知道响应。但是由于有 null,所以它们都可以为 null 或不为 null。所以我假设了。
  • 感谢您的回答,请原谅我还是 swift 的新手