根据特定的子值获取 json 值
Posted
技术标签:
【中文标题】根据特定的子值获取 json 值【英文标题】:get json values depending on specific child value 【发布时间】:2019-04-11 13:43:05 【问题描述】:如何根据子节点中的值获取值。例如 如果我有这样的 JSON
"id": 14,
"name": "АBC",
"picture": 44,
"group":
"id": 2,
"gname": "AAA",
"pic": 1
,
"id": 14,
"name": "АBC",
"picture": 44,
"group":
"id": 1,
"gname": "BB",
"pic": 2
...
]
我想获取子值为“AAA”的所有名称的列表
我知道如何读取 name 的所有值,但如果我只想要具有特定 gname 值的名称,我不知道如何读取它们。
代码如下:
import UIKit
import Alamofire
import SwiftyJSON
class ThirdViewController : UITableViewController
var dataInfo = [[String: AnyObject]]()
let url = "http://XXX"
let header = ["X": "XXX"]
override func viewDidLoad()
super.viewDidLoad()
self.tableView.rowHeight = 50
getData(url: url)
self.tableView.reloadData()
override func numberOfSections(in tableView: UITableView) -> Int
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return dataInfo.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! Cell2
cell.lblName?.text = dataInfo[indexPath.row]["name"] as? String
return cell
func getData(url: String)
Alamofire.request(url, method: .get, headers: header)
.responseJSON response in
if response.result.isSuccess
print("Sucess! Got the data")
let dataJSON : JSON = JSON(response.result.value!)
self.updateData(json: dataJSON)
else
print("Error: \(String(describing: response.result.error))")
self.tableView.reloadData()
func updateData(json : JSON)
if let data = json[].arrayObject
self.dataInfo = data as! [[String: AnyObject]]
self.tableView.reloadData()
else
print("cannot connect to the server")
如果有人可以帮助我,我将不胜感激。
【问题讨论】:
不相关,但viewDidLoad()
和getData(
末尾的行self.tableView.reloadData()
毫无意义,因为调用函数时dataInfo
为空。我们鼓励您使用Codable
来解码数据。 SwiftyJSON
自 Swift 4 以来已过时。
谢谢您的信息先生。
【参考方案1】:
首先你应该使用
Codable
而不是SwiftyJSON
所以你必须添加这些模型
struct Group: Codable
var id: Int?
var gname: String?
var pic: Int?
enum CodingKeys: String, CodingKey
case id, gname, pic
struct User: Codable
var id: Int?
var name: String?
var picture: Int?
var group: Group?
enum CodingKeys: String, CodingKey
case id, name, picture, group
现在你必须把它添加到Alamofire.request
let jsonDecoder = JSONDecoder()
let dataJSON = try? jsonDecoder.decode([User].self, from: response.data!)
现在是过滤器,如果您只需要带有“AAA”的元素,我们可以像过滤数组一样
let users: [User] = []
let searchString = "AAA"
let filterResults = users.filter(
$0.group.filter($0.gname == searchString).count > 1
)
所以你的整个代码看起来像
class ThirdViewController : UITableViewController
var dataInfo: [User] = []
let url = "http://XXX"
let header = ["X": "XXX"]
override func viewDidLoad()
super.viewDidLoad()
self.tableView.rowHeight = 50
getData(url: url)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return dataInfo.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! Cell2
cell.lblName?.text = dataInfo[indexPath.row].name
return cell
func getData(url: String)
Alamofire.request(url, method: .get, headers: header)
.responseJSON response in
if response.result.isSuccess
print("Sucess! Got the data")
guard let responseData = response.data else
print("didn't get any data from API")
return
let jsonDecoder = JSONDecoder()
let dataJSON = try? jsonDecoder.decode([User].self, from: responseData)
// Search data
let searchString = "AAA"
let filterResults = users.filter(
$0.group.gname == searchString
)
self.dataInfo = filterResults
// Reload Data
self.tableView.reloadData()
else
print("Error: \(String(describing: response.result.error))")
【讨论】:
Sir Razi 现在我在转换 link 时出错 - “无法将 'Any' 类型的值转换为预期的参数类型 'Data'” ...如果我将其转换为 Data 我得到这个link - “无法将 '__NSArrayI' (0x1d13f6a70) 类型的值转换为 'NSData' (0x1d13f4dd8)。” @StefanSimić 这是我的一个愚蠢的错误,我已经用上述修复编辑了帖子,希望这是你需要的答案。 @Sir Razi 没关系,但结果属性 filterResults 给了我一个空数组。 啊,我发现了错误,现在可以了。 Ty 寻求帮助,先生。以上是关于根据特定的子值获取 json 值的主要内容,如果未能解决你的问题,请参考以下文章
访问 JToken 的值时出现异常 - 无法访问 Newtonsoft.Json.Linq.JValue 上的子值
动态 Json - 无法访问 Newtonsoft.Json.Linq.JValue 上的子值
C# 无法访问 Newtonsoft.Json.Linq.JProperty 上的子值