如何快速读取本地JSON文件并输出JSON?

问题描述 投票:0回答:2
import Foundation

class ReadLocalJSON {

    static func readJSONFromFile(fileName: String) -> JSON
    {
        var json: JSON
        if let path = Bundle.main.path(forResource: fileName, ofType: "json") {
            do {
                let fileUrl = URL(fileURLWithPath: path)
                let data = try Data(contentsOf: fileUrl, options: .mappedIfSafe)
                json = try? JSONSerialization.jsonObject(with: data)
            } catch {
                print("Something goes wrong when reading local json file.")
            }
        }
        return json
    }

}

我尝试读取本地json文件并输出json。但是json = try? JSONSerialization.jsonObject(with: data)行给出了错误,提示Cannot assign value of type 'Any?' to type 'JSON'

我的json数据看起来像

{
    "leagues":
    [
        {   "name": "Hockey",
            "image": "hockey",
            "games":
            [
                {
                    "game_state": "Final",
                    "game_time": 1456662600,
                    "home_team_city": "Alberta",
                    "home_team_name": "Pigs",
                    "home_team_score": 1,
                    "home_team_logo": "pig",
                    "visit_team_city": "Montreal",
                    "visit_team_name": "Fishes",
                    "visit_team_score": 4,
                    "visit_team_logo": "fish"
                }
            ]
        }
    ]
}

当我将输出类型更改为Any?时,我将打印输出,并且似乎缺少一些元素。

{
    leagues =     (
                {
            games =             (
                                {
                    "game_state" = Final;
                    "game_time" = 1456662600;
                    ...

我该如何解决?

json swift
2个回答
0
投票

步骤1:-首先在您的项目中创建一个模态类

 struct Welcome: Codable {
        let leagues: [League]?
    }

    // MARK: - League
    struct League: Codable {
        let name, image: String?
        let games: [Game]?
    }

    // MARK: - Game
    struct Game: Codable {
        let gameState: String?
        let gameTime: Int?
        let homeTeamCity, homeTeamName: String?
        let homeTeamScore: Int?
        let homeTeamLogo, visitTeamCity, visitTeamName: String?
        let visitTeamScore: Int?
        let visitTeamLogo: String?

        enum CodingKeys: String, CodingKey {
            case gameState = "game_state"
            case gameTime = "game_time"
            case homeTeamCity = "home_team_city"
            case homeTeamName = "home_team_name"
            case homeTeamScore = "home_team_score"
            case homeTeamLogo = "home_team_logo"
            case visitTeamCity = "visit_team_city"
            case visitTeamName = "visit_team_name"
            case visitTeamScore = "visit_team_score"
            case visitTeamLogo = "visit_team_logo"
        }
    }

步骤2:-得到响应后,请写此行,

 let decoder = JSONDecoder()
 let obj = try! decoder.decode(Welcome.self, from: jsonData!)

如果您仍有问题,请告诉我


0
投票

检查下面的解决方案,我将Codable用于JSON解码。

import Foundation


struct Sports: Codable {
    let leagues: [League]
}


struct League: Codable {
    let name, image: String
    let games: [Game]
}


struct Game: Codable {
    let gameState: String
    let gameTime: Int
    let homeTeamCity, homeTeamName: String
    let homeTeamScore: Int
    let homeTeamLogo, visitTeamCity, visitTeamName: String
    let visitTeamScore: Int
    let visitTeamLogo: String

    enum CodingKeys: String, CodingKey {
        case gameState = "game_state"
        case gameTime = "game_time"
        case homeTeamCity = "home_team_city"
        case homeTeamName = "home_team_name"
        case homeTeamScore = "home_team_score"
        case homeTeamLogo = "home_team_logo"
        case visitTeamCity = "visit_team_city"
        case visitTeamName = "visit_team_name"
        case visitTeamScore = "visit_team_score"
        case visitTeamLogo = "visit_team_logo"
    }
}

class ReadLocalJSON {

    static func readJSONFromFile(fileName: String) -> Sports?
    {
        let path = Bundle.main.path(forResource: fileName, ofType: "json")
        let url = URL(fileURLWithPath: path!)
        let sportsData = try? Data(contentsOf: url)
        guard
            let data = sportsData
            else { return nil  }
        do {
            let result = try JSONDecoder().decode(Sports.self, from: data)
            print(result)
            return result
        } catch let error {
            print("Failed to Decode Object", error)
            return nil
        }
    }
}


ReadLocalJSON.readJSONFromFile(fileName: "test")
© www.soinside.com 2019 - 2024. All rights reserved.