【问题标题】:Parse Json with a definition at the beginning用开头的定义解析 Json
【发布时间】:2017-12-14 16:56:54
【问题描述】:

我想解析一个这样结构的Json文件:

{"x":"exchange","b":"usd","ds":["exchange","avgp","mcap","ppc7D","ppc12h","ppc4h","ppc24h"],"data":[["Dow Jones","16360.447","273.89B","6.62","2.14","-0.59","-1.99"],["Dax","877.422","6.80B","38.15","-7.4","-4.44","-4.12"],["nikkei","30.077","2.96B","24.22","-2.3","-4.02","-4.95"],["ATX","281.509","15.29B","214.97","-5.48","-4.58","-10.77"]]}

我不知道如何解析没有定义的 Json 文件,例如: exchange =“道琼斯”,avgp = 16360.477“等。 我在网上找不到任何东西。

我的代码如下所示:

let json = """
{"x":"exchange","b":"usd","ds":["exchange","avgp","mcap","ppc7D","ppc12h","ppc4h","ppc24h"],"data":[["Dow Jones","16360.447","273.89B","6.62","2.14","-0.59","-1.99"],["Dax","877.422","6.80B","38.15","-7.4","-4.44","-4.12"],["nikkei","30.077","2.96B","24.22","-2.3","-4.02","-4.95"],["ATX","281.509","15.29B","214.97","-5.48","-4.58","-10.77"]]}
""".data(using: .utf8)!


struct JsonWebsocket: Decodable {
    let exchange: String
    let avgp: String
    let mcap: String
    let ppc7D: String
    let ppc12h: String
    let ppc4h: String
    let ppc24h: String

    init(exchange: String, avgp: String, mcap: String, ppc7D: String, ppc12h: String, ppc4h: String, ppc24h: String) {
        self.exchange = exchange
        self.avgp = avgp
        self.mcap = mcap
        self.ppc7D = ppc7D
        self.ppc12h = ppc24h
        self.ppc4h = ppc4h
        self.ppc24h = ppc24h
    }
}

func fetchJson() -> [String:JsonWebsocket] {
    let jsonCoinsDecode = json
    let coinDecode = JSONDecoder()
    let output = try! coinDecode.decode([String:JsonWebsocket].self, from: jsonCoinsDecode)
    return output
}

let array = fetchDataTradingPairs()

但由于结构与 json 文件不匹配,它当然会返回错误。

有人知道如何解析这个json吗?

谢谢!

【问题讨论】:

  • 您只需要在 Swift 中正常解析 JSON 还是需要任何条件解析?
  • 感谢您的回答,在解析结束时我想要这样的对象:exchange = Dow Jones, avgp = 16360.447, mcap = 273.89B etc.

标签: json swift codable


【解决方案1】:

创建一个这样的结构。

struct JsonWebsocket: Decodable {
    let x: String
    let b: String
    let ds: [String]
    let data: [[String]]
}

解码

do {
    let coinDecode = JSONDecoder()

    let output = try coinDecode.decode(JsonWebsocket.self, from: json)
    print(output.data)
}
catch let error{
    print(error.localizedDescription)
}

改变原生

否则,创建一个自定义

struct JsonWebsocket: Decodable {
    let exchange: String
    let avgp: String
    let mcap: String
    let ppc7D: String
    let ppc12h: String
    let ppc4h: String
    let ppc24h: String

    init(json: [String]) {
        self.exchange = json[0]
        self.avgp = json[1]
        self.mcap = json[2]
        self.ppc7D = json[3]
        self.ppc12h = json[4]
        self.ppc4h = json[5]
        self.ppc24h = json[6]
    }
}

do {
    let jsonData = try JSONSerialization.jsonObject(with: json, options: []) as? [String: Any]

    var jsonWebsocket: [JsonWebsocket] = []
    if let data = jsonData!["data"] as? [[String]] {
        for d in data {
            jsonWebsocket.append(JsonWebsocket(json: d))
        }
    }

    print(jsonWebsocket.count)
}
catch let error{
    print(error.localizedDescription)
}

【讨论】:

  • 感谢您的回答,但从那里我如何制作对象:exchange = Dow Jones、avgp = 16360.447、mcap = 273.89B 等?使用您提供的解决方案,我只得到一个字符串。谢谢!
  • 确保答案正确然后被接受并投票,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2023-03-05
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多