получить значения из необязательного объекта (массив словаря)? - PullRequest
0 голосов
/ 23 мая 2018

Я пытался получить "имя" из ответа, используя

if let data = text.data(using: .utf8) {
    do {

        return try JSONSerialization.jsonObject(with: data, options: [])  as? [String : AnyObject]
    } catch {
        print(error.localizedDescription)
    }
}
return nil


for field in dict?["report_data"]?["name"] as? [Any] ?? [] {
    print(field)                   
}

, но безуспешно.

Ответ

Необязательно ({"content ":" "," subject ":" Еженедельная посещаемость 2018-05-14 - 2018-05-20 "," attachments ":" [] "," report_data ":" [{\ "name \": \ "Общее количество дней \ ", \" value \ ": \" 7 \ "}, {\" name \ ": \" Present Days \ ", \" value \ ": \" 0 \ "}, {\" name \": \" Всего часов \ ", \" value \ ": \". 0 \ "}, {\" name \ ": \" Average Hours \ ", \" value \ ": \". 0 \ "}, {\ "name \": \ "Дата начала \", \ "значение \": \ "2018-05-14 \"}, {\ "name \": \ "Дата окончания \", \ "значение \": \" 2018-05-20 \ "}]", "asset_reference": "[]", "activity_reference": "[]", "form_approval_field_reference": "[]"})

Плз, помогите мне с этим.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018
func dataToJSON(data: Data) -> AnyObject? {

    do {        
        return try JSONSerialization.jsonObject(with: data, options: []) as AnyObject
    }
    catch let myJSONError {

        print(myJSONError)
    }
    return nil
}

if let list = self.dataToJSON(data: data) as? [Any] {

      // here is array
}

if let list = self.dataToJSON(data: data) as? [String: Any] {

      // here is dictionary
}
0 голосов
/ 23 мая 2018

На самом деле вы получаете ответ в виде словаря типа [String : [[String : String]]].Таким образом, ключ value из "report_data" является массивом типа [[String : String]].

Теперь [[String : String]] на самом деле является массивом словаря.Таким образом, каждый элемент массива - это словарь, в котором [String : String] находится ваш "name" ключ.

let responseDictionary: [String : Any] = [ "report_data" : [
    ["name":"Total Days","value":"7"],
    ["name":"Present Days","value":"0"],
    ["name":"Total Hours","value":".0"],
    ["name":"Average Hours","value":".0"],
    ["name":"Start Date","value":"2018-05-14"],
    ["name":"End Date","value":"2018-05-20"]
] ]

if let arrayOfDictionary = responseDictionary["report_data"] as? [[String : String]] {
    for dictionary in arrayOfDictionary {
        if let name = dictionary["name"] {
            print(name)
        }
    }
}

Ну, for dictionary in arrayOfDictionary выдавал вам ошибку, потому что ваш ответ на самом деле имеет тип [String : Any] когда вы получите это.Но вы не можете выполнять много операций, когда значение имеет тип Any.Поэтому вам нужно привести этот Any к явному типу, чтобы иметь возможность иметь конкретный объект.Сначала необходимо привести массив типа Any к фактическому массиву типа [[String : String]].



Редактировать: Вы обречены на плохо отформатированный JSON .Вот почему у вас проблемы.Посмотрите ниже, как работать с Dictionary до JSON:

let responseDictionary: [String : Any] = [ "content": "",
                                       "subject": "Weekly Attendance 2018-05-14 - 2018-05-20",
                                       "attachments": "[]",
                                       "report_data" : [
                                            ["name":"Total Days","value":"7"],
                                            ["name":"Present Days","value":"0"],
                                            ["name":"Total Hours","value":".0"],
                                            ["name":"Average Hours","value":".0"],
                                            ["name":"Start Date","value":"2018-05-14"],
                                            ["name":"End Date","value":"2018-05-20"]
                                        ],
                                       "asset_reference": "[]",
                                       "activity_reference": "[]",
                                       "form_approval_field_reference": "[]"
                                    ]

Возможно, вы преобразовали этот словарь в JSON, а затем в строку JSON.Но в процессе вы потеряли стандартное форматирование JSON.Как это должно быть сделано:

var text: String = ""

do {
    let jsonData = try JSONSerialization.data(withJSONObject: responseDictionary, options: .prettyPrinted)
    text = String(data: jsonData, encoding: .utf8) ?? ""
} catch {
    print(error.localizedDescription)
}

Теперь, если ваша text является допустимой строкой JSON, все готово:

if let data = text.data(using: .utf8) {
    do {
        let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
        if let response = response, let arrayOfDictionary = response["report_data"] as? [[String : String]] {
            for dictionary in arrayOfDictionary {
                if let name = dictionary["name"] {
                    print(name)
                }
            }
        }
    } catch {
        print(error.localizedDescription)
    }
}
...