如何从本地 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 文件?