swift - 如何映射和过滤低于某个数字的 JSON 嵌套数据字典?
问题描述
我有一个静态 JSON 文件,并且正在成功解码它。但是,我真的很难正确存储它,因为它嵌套了几层深。目前控制台打印出来
["Hamilton", "Chermside", "Coorparoo"]
但是,我需要它来过滤并返回每个郊区低于 500000 的值。所以这样的事情会很棒。
"Hamilton"
"oneBRU": 341000,
"twoBRU": 480000
"Chermside"
"oneBRU": 320000,
"twoBRU": 255000,
"threeBRU": 435000,
"twoBRH": 400000
静态 JSON 文件位于底部。非常感谢
var suburbsJson: [Suburb] = []
struct ResponseData: Codable {
var suburbs: [Suburb]
}
struct Suburb : Codable {
var _id: Int
var name: String
var postcode: Int
var prices: SuburbPrices
}
struct SuburbPrices: Codable {
let oneBRU: Int
let twoBRU: Int
let threeBRU: Int
let twoBRH: Int
let threeBRH: Int
let fourBRH: Int
}
func loadJson(filename fileName: String) -> [Suburb]? {
if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let jsonData = try decoder.decode(ResponseData.self, from: data)
self.suburbsJson = jsonData.suburbs
let suburb = suburbsJson.map { $0.name }
print(suburb)
// print only suburbs below 500000
return jsonData.suburbs
} catch {
print("error:\(error)")
}
}
return nil
}
文件
{
"suburbs": [
{
"_id": 1,
"name": "Hamilton",
"postcode": 4007,
"prices":
{
"oneBRU": 341000,
"twoBRU": 480000,
"threeBRU": 880000,
"twoBRH": 555000,
"threeBRH": 945000,
"fourBRH": 1200000
}
},
{
"_id": 2,
"name": "Chermside",
"postcode": 4032,
"prices":
{
"oneBRU": 320000,
"twoBRU": 255000,
"threeBRU": 435000,
"twoBRH": 400000,
"threeBRH": 585000,
"fourBRH": 860000
}
},
{
"_id": 3,
"name": "Coorparoo",
"postcode": 4151,
"prices":
{
"oneBRU": 323000,
"twoBRU": 359750,
"threeBRU": 535000,
"twoBRH": 500000,
"threeBRH": 750000,
"fourBRH": 970000
}
}
]
}
解决方案
如果您只需要打印值,则可以执行以下操作:
func loadJson(filename fileName: String) -> [Suburb]? {
if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let jsonData = try decoder.decode(ResponseData.self, from: data)
self.suburbsJson = jsonData.suburbs
// print only suburbs below 500000
jsonData.suburbs.forEach { suburb in
print(suburb.name)
if suburb.prices.oneBRU < 500000 {
print("One BRU: \(suburb.prices.oneBRU)")
}
if suburb.prices.twoBRU < 500000 {
print("Two BRU: \(suburb.prices.twoBRU)")
}
if suburb.prices.threeBRU < 500000 {
print("Three BRU: \(suburb.prices.threeBRU)")
}
if suburb.prices.twoBRH < 500000 {
print("Two BRH: \(suburb.prices.twoBRH)")
}
if suburb.prices.threeBRH < 500000 {
print("Three BRH: \(suburb.prices.threeBRH)")
}
if suburb.prices.fourBRH < 500000 {
print("Four BRH: \(suburb.prices.fourBRH)")
}
}
return jsonData.suburbs
} catch {
print("error:\(error)")
}
}
return nil
}
推荐阅读
- css - 使用 Recharts 实现循环进度条
- asp.net - xml to json 将所有数据类型转换为字符串,有没有办法强制元素上的数据类型(.net)
- php - 从 laravel 控制器接收的数据未更新为 vue 变量
- php - 在模型中添加语法“where”,但未选中(datatables ajax codeigniter)
- verilog - 错误:在 verilog 中实现宏时出现不匹配的字符 (')
- dart - 颤振垂直抽屉
- java - 如何获取文本框的字符串值
- angular - angular 6 中的 owl-date-time 选择器从输入中删除时间
- dart - 多个容器相互叠加并在它们之间导航
- python - 在 pandas 中添加行终止符最终会添加另一个 \r