【问题标题】:how to parse this json in swift?如何快速解析这个json?
【发布时间】:2016-12-06 16:35:34
【问题描述】:

我有一个要求

Alamofire.request(.GET,HttpHelper.baseURL+HttpHelper.tripsURL,encoding:.JSON).responseJSON {
response in 

    var json  = JSON(data: response.data!)
    print(json)
    print(json["res"])
}

接着是结果

{
  "res" : "[{\"name\":\"testName\",\"lastName\":\"testLastName\"},{\"name\":\"testName\",\"lastName\":\"testLastName\"}]",
  "status" : "success",
  "out" : "{\"name\":\"testName\",\"lastName\":\"testLastName\"}"
}
[{"name":"testName","lastName":"testLastName"},{"name":"testName","lastName":"testLastName"}]

如何将数据从 res 设置为 struct 或 class User

struct  User  {
    var name : String?
    var lastName : String?
}

请帮忙解决这个问题)非常感谢!!)

【问题讨论】:

  • 您的响应是一个数组 ob 对象,因此您需要解析为 User 数组,这可以使用 alamofire 协议 ResponseObjectSerializableResponseCollectionSerializable 来完成
  • 嗨,欢迎来到 SO!到目前为止你尝试过什么,你在哪里失败了?如果您已经在使用Alamofire,不妨试试AlamofireObjectMapper

标签: ios json swift parse-platform


【解决方案1】:

你可以这样做

var result: [User]()
for user in json["res"] {
   let userTmp = User(name: user["name"], lastName: user["lastName"])
   result.append(userTmp)
}

问候

【讨论】:

  • 所以我尝试了但没有工作((Xcode打破所有代码都是黑色并且没有背光并且无法编译(
【解决方案2】:

基本上是:

class User {
  var name : String?
  var lastName : String?
}

var theUsers = [User]()

Alamofire.request(.GET,HttpHelper.baseURL+HttpHelper.tripsURL,encoding:.JSON)
  .responseJSON { response in 
    var json  = JSON(data: response.data!)
    print(json)

    theUsers = json["res"].map {
      return User (name: $0["name"], lastName: $0.["lastName"])
    }
  })

但是,在此过程中,您可能需要进行一些类型转换。例如,可以将 json["res"] 替换为 (json["res"] as Array<Dictionary<String,String>>) 以使类型检查器和类型推断器满意。

【讨论】:

  • 这个解决方案也彻底破坏了整个项目,报错:Command failed due to signal: Segmentation fault: 11
【解决方案3】:

我正在使用原生 Codable 协议来做到这一点:

class MyClass: Codable {

    var int: Int?
    var string: String?
    var bool: Bool?
    var double: Double?
}


let myClass = MyClass()
myClass.int = 1
myClass.string = "Rodrigo"
myClass.bool = true
myClass.double = 2.2

if let json = JsonUtil<MyClass>.toJson(myClass) {
    print(json) // {"bool":true,"string":"Rodrigo","double":2.2,"int":1}

    if let myClass = JsonUtil<MyClass>.from(json: json) {
        print(myClass.int ?? 0) // 1
        print(myClass.string ?? "nil") // Rodrigo
        print(myClass.bool ?? false) // true
        print(myClass.double ?? 0) // 2.2
    }
}


我创建了一个 JsonUtil 来帮助我:

public struct JsonUtil<T: Codable>  {

    public static func from(json: String) -> T? {
        if let jsonData = json.data(using: .utf8) {
            let jsonDecoder = JSONDecoder()

            do {
                return try jsonDecoder.decode(T.self, from: jsonData)

            } catch {
                print(error)
            }
        }

        return nil
    }

    public static func toJson(_ obj: T) -> String? {
        let jsonEncoder = JSONEncoder()

        do {
            let jsonData = try jsonEncoder.encode(obj)
            return String(data: jsonData, encoding: String.Encoding.utf8)

        } catch {
            print(error)
            return nil
        }
    }
}

如果您对 Any 有问题,请输入您的对象。请看我的另一个答案:

https://stackoverflow.com/a/51728972/3368791

祝你好运:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多