快速解析 Json
Posted
技术标签:
【中文标题】快速解析 Json【英文标题】:Parse Json swift 【发布时间】:2019-04-29 12:53:21 【问题描述】:如何在带有数字元素的 json 中检索信息? 我必须快速获取 Json 中的信息,但我有数字元素,我不知道如何获取这些部分的信息。
在我的 Json 中,我设法恢复了一些信息,没有问题。但是那些有标题的人我不能包含一个数字,因为我不能声明一个变量“1”例如。我在day中取元素标题,但不知道如何在排名中取1中的信息点
Json的url是:https://www.lnr.fr/flux/rankings?id_competition=prod2
class Classification: Codable
let channel : Channel
let classification : [Day]
init(channel: Channel ,classification: [Day] )
self.channel = channel
self.classification = classification
class Channel: Codable
let title: String
init (title: String)
self.title = title
class Day: Codable
let day: day
init(day: day)
self.day = day
class day: Codable
let title: String
let rankings : Equipe
init(title: String, rankings: Equipe)
self.title = title
self.rankings = rankings
class Equipe: Codable
let club: Club
let difference: String
let points: String
let points_marques: String
let points_encaisses: String
let nombre_matchs_joues: String
let nombre_matchs_gagnes: String
let nombre_matchs_nuls: String
let nombre_matchs_perdus: String
init(club: Club,difference: String, points: String, points_marques: String, points_encaisses: String, nombre_matchs_joues: String, nombre_matchs_gagnes: String, nombre_matchs_nuls: String, nombre_matchs_perdus: String)
self.club = club
self.difference = difference
self.points = points
self.points_marques = points_marques
self.points_encaisses = points_encaisses
self.nombre_matchs_joues = nombre_matchs_joues
self.nombre_matchs_gagnes = nombre_matchs_gagnes
self.nombre_matchs_nuls = nombre_matchs_nuls
self.nombre_matchs_perdus = nombre_matchs_perdus
class Club: Codable
let name: String
let url: logo
init(name: String, url: logo)
self.name = name
self.url = url
class logo: Codable
let url: String
init(url: String)
self.url = url
【问题讨论】:
Swift 4 parsing json numeric keys with 1+n amount的可能重复 【参考方案1】:您可以为此使用自定义 CodingKeys;结帐Encoding and Decoding Custom Types
例子:
struct Foo: Codable
var bar: String
var baz: Int
enum CodingKeys: String, CodingKey
case bar = "1"
case baz = "2"
let json = "\"1\":\"bar\",\"2\":\"baz\"".data(using: .utf8)
let decoder = JSONDecoder()
let foo = try decoder.decode(Foo.self, from: json)
// foo.bar = 'bar'
// foo.baz = 'baz'
// this also works with encoding
let foo = Foo(bar: "MyBar", baz: "MyBaz")
// foo encodes to "1":"MyBar", "2":"MyBaz"
嵌套示例 结构 FooBar:可编码 var foo: 富 var bar: 字符串 var baz: 整数
struct Foo: Codable
var bar1: String
var bar2: String
var bar3: String
var bar4: String
var bar5: String
var bar6: String
enum CodingKeys: String, CodingKey
case bar1 = "1"
case bar2 = "2"
case bar3 = "3"
case bar4 = "4"
case bar5 = "5"
case bar6 = "6"
这个和json结构一样:
"foo":
"1": "One",
"2": "Two",
"3": "Three",
"4": "Four",
"5": "Five",
"6": "Six"
,
"bar": "Barrr",
"baz": "Bazz"
【讨论】:
我不明白如何使用它。我必须使用 struc 和案例,但我如何才能在我的案例中加入这个 您不必使用结构,但对于您的用例,我可能会使用结构而不是类(查看Building Better Apps with Value Types in Swift 了解更多信息)。现在会发生的是json"1":"bar","2":"baz"
将被转换为struct
Foo.bar == 'bar' and baz == 'baz'
我很抱歉,但我不明白,在我的 json 和我的代码中,我必须添加什么才能做到这一点?
仔细查看我给定的示例和您的 JSON 输出。你说键rankings
是一个单一的Equipe
,不是这样的,排名是16键的字典(“1”到“16”)。所以你需要另一个“介于两者之间”的课程。最好将 rankings
设为实际数组而不是字典,然后您可以这样做:rankings: [Equipe]
并且您不需要 CodingKeys
上课日:Codable let title: String let rankings : [Equipe] init(title: String, rankings: [Equipe]) self.title = title self.rankings = rankings 像这样?但它不起作用【参考方案2】:
您可以使用 CodingKeys
例子:
struct MyModel: Codable
let first: String
enum CodingKeys: String, CodingKey
case first = "1"
【讨论】:
你有我的 Json 的例子吗? 问题是:理论上这些数字是无限的吗? 如果是这样,你也可以把这个json解码为[Int: Model]的字典以上是关于快速解析 Json的主要内容,如果未能解决你的问题,请参考以下文章