转换 JSON 个嵌套对象
Convert JSON nested objects
我从 Foursquare API 得到以下 JSON,我一直在努力提取数据:
{
"meta":{
"code":200,
"requestId":"58122e59498e5506a1b23580"
},
"response":{
"venues":[
{
"id":"4d56c381a747b60cd4a12c2b",
"name":"Sports Circle",
"contact":{},
"location":{
"lat":31.9,
"lng":35.9,
"labeledLatLngs":[
{
"label":"display",
"lat":31.9,
"lng":35.90
}
],
],
"confident":true
}
}
}
除了 lat
和 lng
值之外,我还想在 venues
中获取 name
。到目前为止我已经尝试过了,但是它从 JVenues
的第二个 if 语句中退出,因为它是 nil
:
func parseData (JSONData: Data){
do {
var readableJson = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! [String:AnyObject]
if let JResponse = readableJson ["response"] as? [String:AnyObject] {
if let JVenues = JResponse["venues"] as? [String:AnyObject]{
if let JName = JVenues["name"] as? String{
NSLog(JName)
}
}
}
} catch {
print(error)
}
}
这就是其他答案的意思。如果您能看到所有内容,可能会更有意义...
if let JResponse = readableJson ["response"] as? [String : AnyObject] {
if let JVenues = JResponse["venues"] as? [[String : AnyObject]] {
if let JName = JVenues.first?["name"] as? String {
NSLog(JName)
}
}
}
请注意,这只会获取场地数组中的第一个名称。
编辑:
我更喜欢这样的东西。定义一个结构并将您的字典转换为该结构:
struct Venue {
var name: String?
var venueId: String?
init(_ venueDictionary: [String : AnyObject]) {
self.name = venueDictionary["name"] as? String
self.venueId = venueDictionary["id"] as? String
}
}
在您的 class 中创建一个 属性 例如:
var venues = [Venue]()
从您的 JSON 将词典映射到场地数组。为了约定,我重命名了以大写字母开头的变量。
if let response = readableJson ["response"] as? [String : AnyObject] {
if let responseVenues = response["venues"] as? [[String : AnyObject]] {
self.venues = responseVenues.map({ Venue([=13=])) })
}
}
在 class 中的任意位置使用,例如:
let venue = self.venues.first
print(venue?.name)
或:
if let venue = self.venues.find({ [=15=].name == "Sports Circle" }) {
print("found venue with id \(venue.venueId)")
}
我从 Foursquare API 得到以下 JSON,我一直在努力提取数据:
{
"meta":{
"code":200,
"requestId":"58122e59498e5506a1b23580"
},
"response":{
"venues":[
{
"id":"4d56c381a747b60cd4a12c2b",
"name":"Sports Circle",
"contact":{},
"location":{
"lat":31.9,
"lng":35.9,
"labeledLatLngs":[
{
"label":"display",
"lat":31.9,
"lng":35.90
}
],
],
"confident":true
}
}
}
除了 lat
和 lng
值之外,我还想在 venues
中获取 name
。到目前为止我已经尝试过了,但是它从 JVenues
的第二个 if 语句中退出,因为它是 nil
:
func parseData (JSONData: Data){
do {
var readableJson = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! [String:AnyObject]
if let JResponse = readableJson ["response"] as? [String:AnyObject] {
if let JVenues = JResponse["venues"] as? [String:AnyObject]{
if let JName = JVenues["name"] as? String{
NSLog(JName)
}
}
}
} catch {
print(error)
}
}
这就是其他答案的意思。如果您能看到所有内容,可能会更有意义...
if let JResponse = readableJson ["response"] as? [String : AnyObject] {
if let JVenues = JResponse["venues"] as? [[String : AnyObject]] {
if let JName = JVenues.first?["name"] as? String {
NSLog(JName)
}
}
}
请注意,这只会获取场地数组中的第一个名称。
编辑:
我更喜欢这样的东西。定义一个结构并将您的字典转换为该结构:
struct Venue {
var name: String?
var venueId: String?
init(_ venueDictionary: [String : AnyObject]) {
self.name = venueDictionary["name"] as? String
self.venueId = venueDictionary["id"] as? String
}
}
在您的 class 中创建一个 属性 例如:
var venues = [Venue]()
从您的 JSON 将词典映射到场地数组。为了约定,我重命名了以大写字母开头的变量。
if let response = readableJson ["response"] as? [String : AnyObject] {
if let responseVenues = response["venues"] as? [[String : AnyObject]] {
self.venues = responseVenues.map({ Venue([=13=])) })
}
}
在 class 中的任意位置使用,例如:
let venue = self.venues.first
print(venue?.name)
或:
if let venue = self.venues.find({ [=15=].name == "Sports Circle" }) {
print("found venue with id \(venue.venueId)")
}