【问题标题】:Alamofire 4.0 JSOn parsing SwiftAlamofire 4.0 JSOn 解析 Swift
【发布时间】:2016-12-02 00:10:55
【问题描述】:

我是 Alamofire 的新手,我正在测试一些 API。我遇到了外汇汇率。所以JSON文件是这样的

["base": CAD, "date": 2016-12-01, "rates": {
AUD = "1.0097";
BGN = "1.3735";
BRL = "2.57";
CHF = "0.7559";
CNY = "5.1388";
CZK = "19.004";
DKK = "5.2248";
EUR = "0.70225";
GBP = "0.59058";
HKD = "5.7881";
HRK = "5.2985";
HUF = "220.48";
IDR = 10108;
ILS = "2.8607";
INR = "51.009";
JPY = "85.246";
KRW = "871.9400000000001";
MXN = "15.403";
MYR = "3.331";
NOK = "6.2941";
NZD = "1.0539";
PHP = "37.102";
PLN = "3.1374";
RON = "3.1631";
RUB = "47.591";
SEK = "6.8775";
SGD = "1.0657";
THB = "26.616";
TRY = "2.6006";
USD = "0.7462800000000001";
ZAR = "10.504";}]

typealias JSONStandard = [String: AnyObject]

func parseData(JSONData:Data) {
    do {
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
        if let rates = readableJSON["rates"] as? JSONStandard{
            for i in 0..<rates.count {
                let rate = rates[i] as! //Here
            }
            print(rates)
        }
        print(readableJSON)

    } catch {
        print(error)
    }
}

我能够获得侧面的“汇率”,但我不知道如何解析“汇率”中的所有数据。我想我必须把它保存在字典里。很困惑谢谢

【问题讨论】:

  • 那甚至不是一个有效的数据集。它不应包含分号。
  • @ElTomato 确实如此,我才意识到这一点。但我确信有办法解决它
  • 没有办法。您当然可以手动修复 JSON 数据集并将其作为 Swift 文件读取。
  • @ElTomato 问题是这是来自 API,所以我可能需要研究不同的。或者我只是做错了一切。呵呵fixer.io这是我使用的api,如果你想检查一下

标签: json swift parsing alamofire


【解决方案1】:

如您所见,它是String中的double值,因此您需要先将AnyObject转换为String,然后再将其转换为Double。你可以这样做(在 Swift 游乐场测试):

import Foundation

typealias JSONStandard = [String: AnyObject]

func parseData(JSONData:Data) {
    do {
        guard let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as? JSONStandard,
            let ratesJSON = readableJSON["rates"] as? JSONStandard
            else { return }
        print("Readable JSON :")
        print(readableJSON)
        let rates = ratesJSON.flatMap({ (key, value) -> ([String: Double]) in
            guard let value = value as? String, let convertedValue = Double(value) else { return [:] }
            return [key: convertedValue]
        })
        print("Rates :")
        print(rates)

    } catch {
        print(error)
    }
}

let jsonString = "{\"base\": \"CAD\", \"date\": \"2016-12-01\", \"rates\": { \"AUD\": \"1.0097\", \"BGN\": \"1.3735\", \"BRL\": \"2.57\"}}"
let jsonData = jsonString.data(using: String.Encoding.utf8)!
parseData(JSONData: jsonData)

结果:

Readable JSON :
["base": CAD, "date": 2016-12-01, "rates": {
    AUD = "1.0097";
    BGN = "1.3735";
    BRL = "2.57";
}]
Rates :
[("BGN", 1.3734999999999999), ("AUD", 1.0097), ("BRL", 2.5699999999999998)]

【讨论】:

  • 可以告诉我guard的详细用法吗?
  • @J.Kim1205 守卫就像一个if,但它只会检查条件是否为真,也称为保镖模式。所以它会像这个保护条件一样工作 else { // 你的代码并返回 },如果条件为真,它将转到下一行,如果不是,它将转到 else 块这里也有一个很好的解释 -> @ 987654321@
  • jsonString.data?这是哪里来的
  • @J.Kim1205 哦,这是 Swift 3 的语法,在 Swift 2 中应该是 jsonString.dataUsingEncoding(NSUTF8StringEncoding),但我看到你使用的是 Swift 3 对吗?
  • 我的意思是 .flatmap 部分以前从未见过
【解决方案2】:

你必须把它保存到一个 Double 数组中:

var yourArray = [Double]()

    for i in 0..<rates.count {
        let rate = rates[i] as! Double
        print(rate)
        yourArray.append(rate)
    }

print(yourArray.description)

【讨论】:

  • 这意味着我只保存我的双精度值,我也想保存我的字符串
猜你喜欢
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
相关资源
最近更新 更多