Как отфильтровать недействительные данные, используя swift 4.1 codable (json decode) - PullRequest
0 голосов
/ 20 мая 2018

Я познакомился со структурой Codable в swift 4.0, *.Итак, я попробовал это при декодировании josn.

if let jsonData = jsonString.data(using: .utf8) {
    let decodingData = try? JSONDecoder().decode(SampleModel.self, from: jsonData)
}

Пример образца модели данных ниже.

struct SampleModel : Codable {
    var no: Int?
    var category: Int?
    var template_seq: Int?
}

А пример данных json приведен ниже ..

{
    "data": {
        "result" : 1 
        "total_count": 523,
        "list": [
            {
                "no": 16398,
                "category" : 23,
                "template_seq" : 1
            },
            {
                "no": -1,
                "category" : 23,
                "template_seq" : 1
            }
        ]
    }
}

Но я хочу фильтровать неправильные данные.Если значение «нет» меньше или равно 0, это недопустимое значение.

Перед тем, как не использовать кодируемый ... ниже.(используя ответ Alamifre ison)

guard let dictionaryData = responseJSON as? [String : Any]  else { return nil }

guard let resultCode = dictionaryData["result"] as? Bool , resultCode == true  else { return nil }

guard let theContainedData = dictionaryData["data"] as? [String:Any] else { return nil }

guard let sampleListData = theContainedData["list"] as? [[String : Any]] else { return nil }

var myListData =  [MyEstimateListData]()

for theSample in sampleListData {
    guard let existNo = theSample["no"] as? Int, existNo > 0 else {
        continue
    }
    myListData.append( ... ) 
}

return myListData

как отфильтровать неверные или недействительные данные с помощью swift 4.0 Codable ??

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы можете сделать кодируемый для начального резонанса

Вот ваша модель :

import Foundation

struct Initial: Codable {
    let data: DataModel?
}

struct DataModel: Codable {
    let result, totalCount: Int
    let list: [List]?

    enum CodingKeys: String, CodingKey {
        case result
        case totalCount = "total_count"
        case list
    }
}

struct List: Codable {
    let no, category, templateSeq: Int

    enum CodingKeys: String, CodingKey {
        case no, category
        case templateSeq = "template_seq"
    }
}

extension Initial {
    init(data: Data) throws {
        self = try JSONDecoder().decode(Initial.self, from: data)
    }
}

И использовать это так:

if let initail  = try? Initial.init(data: data) , let list = initail.data?.list {
               var myListData = list.filter { $0.no > 0 }
            }
0 голосов
/ 20 мая 2018

Да, вы должны использовать фильтры для этого с кодируемым:

1: ваша структура должна соответствовать вашему ответу так:

struct SampleModel : Codable {
    var result: Int?
    var total_count: Int?
    var list: [List]?
}
struct List : Codable {
    var no: Int?
    var category: Int?
    var template_seq: Int?
}

2: проанализировать ваш ответ, используяcodable структура выглядит так:

do {
    let jsonData = try JSONSerialization.data(withJSONObject: dictionaryData["data"] as Any, options: JSONSerialization.WritingOptions.prettyPrinted)
    let resultData = try JSONDecoder().decode(SampleModel.self, from: jsonData)
    success(result as AnyObject)
} catch let message {
    print("JSON serialization error:" + "\(message)")
}

3: теперь вы можете отфильтровать недействительные данные просто:

let filterListData = resultData.list?.filter({$0.no > 0})
let invalidData = resultData.list?.filter({$0.no <= 0})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...