如何从本地 JSON 文件解析数据并保存在模型类中并在 tableview 中使用

Posted

技术标签:

【中文标题】如何从本地 JSON 文件解析数据并保存在模型类中并在 tableview 中使用【英文标题】:how to parse data from local JSON file and save in a model class and use in tableview 【发布时间】:2018-11-13 09:55:38 【问题描述】:

我想从本地 JSON 文件中解析 JSON,并希望将该数据保存在模型类中并在 tableview 上显示。我如何从本地文件中解析 JSON。

这是我的 JSON 文件——JsonFile.json


"teams":[
         
         "teamName":"Arsenal",
         "image":"Arsenal",
         "nextMatch":"in 2 days",
         "matches":[
                    
                    "oppositeTeam":"teamName",
                    "matchTimings":"121212",
                    "matchId":"ID 213432"
                    ,
                    
                    "oppositeTeam":"teamName",
                    "matchTimings":"121212",
                    "matchId":"ID 213432"
                    
                    ],
         "fixtures":
         "oppositeTeam":"teamName",
         "oppositeTeamScore":"7",
         "homeTeamScore":"4",
         "homeTeamCards":"True",
         "oppositeTeamCards":"false",
         "fixtureId":"ID 213432"
         
         ,
         
         "teamName":"Chelsea",
         "image":"Chelsea",
         "nextMatch":"in 2 days",
         "matches":
         "oppositeTeam":"teamName",
         "matchTimings":"121212",
         "matchId":"ID 213432"
         ,
         "fixtures":
         "oppositeTeam":"teamName",
         "oppositeTeamScore":"7",
         "homeTeamScore":"4",
         "homeTeamCards":"True",
         "oppositeTeamCards":"false",
         "fixtureId":"ID 213432"
         
         ,
         
         "teamName":"India",
         "image":"India",
         "nextMatch":"in 2 days"
         
         ]

这是我的模型类,我想在其中存储 JSON 文件中的数据。

   class TeamData : Decodable
let teamName : String
let image : String
let nextMatch : String?
let matches : [Match]
let fixtures : [Fixture]

class Match : Decodable
let oppositeTeam : String?
let matchTimings : String?
let matchId : String?

class Fixture : Decodable
let oppositeTeam : String?
let oppositeTeamScore : String?
let HomeTeamScore : String?
let HomeTeamCards : String?
let oppositeTeamCards : String?
let fixtureId : String?

现在如何解析 JSON 文件中的数据并将其保存在模型类中。我看过很多教程,但每个教程都在使用 API,所以如何从本地文件解析 JSON 真的很混乱

【问题讨论】:

JSON数据不一致。 matches 是一次数组和一次字典,这使得解码过程变得昂贵。由于文件是本地文件,我建议更改 JSON 以合并类型。顺便说一下fixtures 是字典(注意)不是数组。并且不要忽略根对象,即带有键 teams 的字典。 好的,我编辑了我的答案。现在它应该可以正常工作了 【参考方案1】:

修复 TeamData 的 json 结构和类

更改您的 TeamData 类以匹配您的 json

class TeamData: Decodable 
    var teamName : String
    var image : String
    var nextMatch : String?
    var matches : [Match]?
    var fixtures : Fixtures?

对于切尔西队,您忘记将比赛放入数组中,所以像这样修复它:

[
     "oppositeTeam":"teamName",
     "matchTimings":"121212",
     "matchId":"ID 213432"
]

我认为,如果您的 json 文件中只有 TeamData 对象数组,那最好。所以,删除

 “teams”:

最后是,只保留一组团队

如何从 json 文件中获取 json

在您的 ViewController 中的某处创建 TeamData 的空数组

 var teams = [TeamData]()

现在获取您的 json 文件的引用,尝试从中创建数据并使用 JSONDecoder 解码此数据

let url = Bundle.main.url(forResource: "JsonFile", withExtension: "json")!
do 
    let data = try Data(contentsOf: url)
    teams = JSONDecoder().decode([TeamData].self, from: data)
 catch 
    print(error)

我还建议您将文件重命名为 Teams.json

也不要忘记在获取文件 URL 的位置重命名它

【讨论】:

基本上你是对的,但这会导致 Expected to decode Array but found a dictionary instead 错误。 它仍然不起作用,但错误与您的答案无关。结构中有一些错误的类型。 @vadian 好的,现在我也解决了结构中类型错误的问题 我们如何获取“matchId”@RobertDresler @harinderrana 将“matchId”:”ID 213432”替换为“matchId”:213432(不要忘记在 json 结构中的任何地方都像这样替换它)并在 Match 类中替换 var matchId: String ?使用 var matchId: Int?当您想获取阿森纳第一场比赛的示例 matchId 时,在您的代码中使用 teams[0].matches[0].matchId!

以上是关于如何从本地 JSON 文件解析数据并保存在模型类中并在 tableview 中使用的主要内容,如果未能解决你的问题,请参考以下文章

我将如何将 JSON 文件从 web 服务保存到本地 JSON 文件?

如何从 JSON 解析到 Unity GameObject

如何在 FutureBuilder 中解析从本地主机接收的 JSON 对象

php,JavaScript 如何读取并修改json文件?

如何从 JSON 文件构建模型

pyhton 从web获取json数据 保存到本地然后再读取