如何使用swift 4.1编码(json解码)过滤无效数据

如何使用swift 4.1编码(json解码)过滤无效数据,json,swift,decode,codable,decodable,Json,Swift,Decode,Codable,Decodable,我了解了swift 4.0中的struct Codable,*。 所以,我在解码乔森的时候就试过了 if let jsonData = jsonString.data(using: .utf8) { let decodingData = try? JSONDecoder().decode(SampleModel.self, from: jsonData) } 下面是示例数据模型 struct SampleModel : Codable { var no: Int? va

我了解了swift 4.0中的struct Codable,*。 所以,我在解码乔森的时候就试过了

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,则该值无效

在不使用codable…之前,请参见下文。 使用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筛选错误数据或无效数据???

是的,您必须使用带有Codable的筛选器:

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?
}
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)")
}
2:使用如下可编码结构解析您的响应:

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?
}
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})

您可以使初始响应可编码

这是您的模型:

然后像这样使用它:

if let initail  = try? Initial.init(data: data) , let list = initail.data?.list {
               var myListData = list.filter { $0.no > 0 }
            }

如果有人要投反对票,请解释!