Разбор ответа JSON из лямбда-функции AWS - PullRequest
0 голосов
/ 08 июня 2019

Я только что получил лямбда-функцию AWS, работающую так, как я ожидал, но у меня возникают проблемы с анализом ее JSON-ответа.Я использую SwiftyJSON для этого.

Вот мой тестовый код:

let json = JSON(task.result!)
print("SWyJSON: \(json)")

if let jsonDic = json.dictionary {
    print("SWyJSON2a: \(jsonDic)")
    print("SWyJSON2b: \(String(describing: jsonDic["body"]!))")
    if let x = json.dictionary?["body"]?.dictionary {
        print("SWyJSON2c: \(String(describing: x["Users"]))")
    }
}

SWyJSON: {
  "inBound" : "9bf69.....14d5ac4",
  "body" : "{\"Users\":[{\"Username\":\"test1\",\"Attributes\":[{\"Name\":\"email\",    \"Value\":\"y547170@nidtv.net\"}],\"UserCreateDate\":\"2019-06-03T02:53:03.300Z\",  \"UserLastModifiedDate\":\"2019-06-03T02:53:56.580Z\",\"Enabled\":true,\"UserStatus\":\"CONFIRMED\"}]}",
  "statusCode" : 200
}

SWyJSON2a: ["inBound": 9bf69.....14d5ac4, "body": {"Users":[{"Username":"test1","Attributes":[  {"Name":"email","Value":"y547170@nidtv.net"}],"UserCreateDate":"2019-06-03T02:53:03.300Z",    "UserLastModifiedDate":"2019-06-03T02:53:56.580Z","Enabled":true,"UserStatus":"CONFIRMED"}]}, "statusCode":     200]

SWyJSON2b: {"Users":[{"Username":"test1","Attributes":[{"Name":"email","Value":"y549860@nwytg.net"}],   "UserCreateDate":"2019-06-03T02:53:03.300Z","UserLastModifiedDate":"2019-06-03T02:53:56.580Z", "Enabled":true,"UserStatus":"CONFIRMED"}]}

Мой вопрос: что не так в коде, так что последний отпечаток не дает никакого результата?

SWyJSON, SWyJSON2a и SWyJSON2b показывают некоторый результат в консоли отладки Xcode, как я ожидаю, но не SWyJSON2c.Где бы я ожидал что-то вроде:

"Users":[{"Username":"test1","Attributes":[{"Name":"email","Value":"y549860@nwytg.net"}],   "UserCreateDate":"2019-06-03T02:53:03.300Z","UserLastModifiedDate":"2019-06-03T02:53:56.580Z", "Enabled":true,"UserStatus":"CONFIRMED"}]

или:

[{"Username":"test1","Attributes":[{"Name":"email","Value":"y549860@nwytg.net"}],   "UserCreateDate":"2019-06-03T02:53:03.300Z","UserLastModifiedDate":"2019-06-03T02:53:56.580Z", "Enabled":true,"UserStatus":"CONFIRMED"}]

1 Ответ

1 голос
/ 08 июня 2019

body значение является строкой, а не словарем, поэтому измените

if let x = json.dictionary?["body"]?.dictionary {

на

if let x = json.dictionary?["body"]?.string {

    let data = Data(x.utf8)

    let content = try? JSONSerialization.jsonObject(with:data, options: [])

    if let _  =  content as? [[String:Any]] { // array 

       let res = try?  JSONDecoder().decode([Root].self,from:data)

       print(res)

    }
    else if let dic  =  content as? [String:Any] {  {

       guard let users = dic["Users"] else { return } // dictionay

       guard let jsonData = try? JSONSerialization.data(withJSONObject: users, options:[]) else { return }

       let res = try?  JSONDecoder().decode([Root].self,from:jsonData)

       print(res)

    }
}


  // MARK: - Element
struct Root: Codable {
    let username: String
    let attributes: [Attribute]
    let userCreateDate, userLastModifiedDate: String
    let enabled: Bool
    let userStatus: String

    enum CodingKeys: String, CodingKey {
        case username = "Username"
        case attributes = "Attributes"
        case userCreateDate = "UserCreateDate"
        case userLastModifiedDate = "UserLastModifiedDate"
        case enabled = "Enabled"
        case userStatus = "UserStatus"
    }
}

// MARK: - Attribute
struct Attribute: Codable {
    let name, value: String

    enum CodingKeys: String, CodingKey {
        case name = "Name"
        case value = "Value"
    }
}
...