在swift 4中解码返回什么?

在swift 4中解码返回什么?,swift,decode,Swift,Decode,调用.decode()对结构进行解码时,它会返回什么? 我在苹果的文档中查过了,但上面说的都是“内存中表示的本机格式”,但这意味着什么呢?有人能帮我吗 我问这个问题是因为当我从JSON数据中获得空值时,我的应用程序正在崩溃,这行代码: let plantData = try decoder.decode([Plants].self, from: data) 这是我的结构: struct Plants: Codable { let date: String let monthl

调用
.decode()
对结构进行解码时,它会返回什么? 我在苹果的文档中查过了,但上面说的都是“内存中表示的本机格式”,但这意味着什么呢?有人能帮我吗

我问这个问题是因为当我从JSON数据中获得空值时,我的应用程序正在崩溃,这行代码:

let plantData = try decoder.decode([Plants].self, from: data)
这是我的
结构

struct Plants: Codable {

    let date: String
    let monthlyAVG: String?

    enum CodingKeys : String, CodingKey {

        case date = "Date"
        case monthlyAVG = "30_Day_MA_MMBTU"
    }
}
这是我的解析代码:

func parseJson() {
    let url = URL(string: ebr_String)

    // Load the URL
    URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
        // If there are any errors don't try to parse it, show the error
        guard let data = data, error == nil else { print(error!); return }

        let decoder = JSONDecoder()
        do{
            let plantData = try decoder.decode([Plants].self, from: data)
            print(plantData)                
这只是我得到的信息的一小部分:

MorrowTabbedApp.Plants(date: "2018-02-22", monthlyAVG: Optional("1210.06")), MorrowTabbedApp.Plants(date: "2018-02-23", monthlyAVG: nil)]
以下是来自web的JSON片段:

[
    {"Date":"2018-02-21","30_Day_MA_MMBTU":"1210.06"},
    {"Date":"2018-02-22","30_Day_MA_MMBTU":"1210.06"},
    {"Date":"2018-02-23","30_Day_MA_MMBTU":null}
]

JSONDecoder
decode
方法是一种“通用”方法。它返回在方法的第一个参数中指定的任何类型的实例。在您的情况下,它返回一个
[Plants]
,即
数组
,即
植物
实例的快速数组

如果它因为JSON中的
null
值而崩溃,那么您必须确定什么是null,是否适合为null,如果是,请确保与可能为
null
的值关联的任何
Plants
属性都应该是可选的


根据您用代码片段更新的答案,我建议:

// Personally, I'd call this `Plant` as it appears to represent a single instance

struct Plant: Codable {
    let date: String
    let monthlyAVG: String?   // Or you can use `String!` if you don't want to manually unwrap this every time you use it

    enum CodingKeys : String, CodingKey {
        case date = "Date"
        case monthlyAVG = "30_Day_MA_MMBTU"
    }
}
以及:

注意
过滤器
行,它只选择那些
monthlyAVG
不是
nil
的事件


还有一些其他建议:

  • 就个人而言,如果可以的话,我希望web服务只返回您想要的值(那些带有实际
    monthlyAVG
    的值),然后将
    monthlyAVG
    属性更改为非可选属性。但这取决于你

  • 如果
    monthlyAVG
    实际上是一个数字平均值,我会将web服务更改为完全不以字符串形式返回,而是以不带引号的数字形式返回。然后将
    Plant
    的属性更改为
    Double
    或其他属性

  • 如果需要,可以将
    date
    属性更改为
    date
    ,然后使用
    dateDecodingStrategy
    将字符串转换为
    date

    struct Plant: Codable {
        let date: Date
        let monthlyAVG: String?
    
        enum CodingKeys : String, CodingKey {
            case date = "Date"
            case monthlyAVG = "30_Day_MA_MMBTU"
        }
    }
    

    例如,如果希望图表的x轴实际表示时间,而不是一组均匀分布的数据点,则可以这样做


  • 我这里有一行特定的代码:let PlantData=try decoder.decode([Plants].self,from:data)。我搞不懂这是怎么回事back@Gina请将您的问题与所有相关详细信息一起提交,而不是在评论中发布信息。是。我发现了空值,我想将其更改为零,或者如果可能的话将其完全删除。我确实将此特定值的属性设置为String?。我正在考虑将解析后的数据传递到另一个函数中,并在其中循环检查空值,然后尽可能删除它们。谢谢。我已经更新了我的问题。谢谢你的耐心。我对斯威夫特很陌生,事实证明很难将我的头脑集中在它上面。@Gina-好的,你的代码看起来不错。这看起来不像是崩溃。你是说你想过滤掉所有出现在
    “30天”
    null
    的情况吗?或者你在问如何处理那些
    可选(…)
    参考资料?是的。过滤掉“30天”为空的所有事件。这些值应该是一个字符串形式的数字,我假设我必须将它们解析为整数才能使用它们,因为我以后必须在我已经使用iOS图表制作的实时图形上输入这些数字。现在我想了想,我只想完全删除空值,因为我不希望图上出现0。哇,非常感谢!我真的很感激!我将回顾代码,看看是否可以在代码中实现您的建议。
    struct Plant: Codable {
        let date: Date
        let monthlyAVG: String?
    
        enum CodingKeys : String, CodingKey {
            case date = "Date"
            case monthlyAVG = "30_Day_MA_MMBTU"
        }
    }
    
    do {
        let decoder = JSONDecoder()
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        decoder.dateDecodingStrategy = .formatted(formatter)
    
        let plantData = try decoder.decode([Plant].self, from: data)
            .filter { $0.monthlyAVG != nil }
    
        print(plantData)
    } catch let parseError {
        print(parseError)
    }