如何在json数组结构中添加附加字段
Posted
技术标签:
【中文标题】如何在json数组结构中添加附加字段【英文标题】:how to add additional field in json array structure 【发布时间】:2018-04-29 08:41:03 【问题描述】:我需要添加额外的布尔字段来制作可选择的品牌和型号表。 原始 json 结构为:
"brands": [
"id": "19",
"name": "Audi",
"sort": "1",
"num": 1,
"models": [
"id": "190",
"name": "TTS",
"num": 1
,
"id": "189",
"name": "TT",
"num": 2
,
"id": "188",
"name": "V8",
"num": 3
,
"id": "187",
"name": "SQ5",
"num": 4
],
......
我需要在品牌和模型结构中添加 isExpended: Bool = false。所以数组应该是这样的:
"brands": [
---> "isExpanded": false,
"id": "19",
"name": "Audi",
"sort": "1",
"num": 1,
"models": [
---> "isExpanded": false,
"id": "190",
"name": "TTS",
"num": 1
,
我的模特:
struct auto_data: Decodable
var brands: [brands]
var gearbox: [gearbox]
var fuel: [fuel]
var version: String
struct brands: Decodable
var id: String
var name: String
var sort: String
var num: Int
var models: [brand_models]
struct brand_models: Decodable
var id: String
var name: String
var num: Int
获取我使用的 json:
func get_data (order_type: String, localization: String, version: String, completion: @escaping ([brands]?) -> Void)
let encodedBodyParams = "order_type=\(order_type)&localization=\(localization)&version=\(version)"
let url = URL(string: "http://skat.az/forapi/api/get_data.php")
Alamofire.request(url!, method: .post, parameters: [:], encoding: encodedBodyParams, headers: [:]).responseJSON (response) in
if response.result.isSuccess
do
let result = response.data
let data = try JSONDecoder().decode(auto_data.self, from: result!)
completion(data.brands)
catch
print("Error: \(error)")
print("models ОК!")
else
print("error response: \(String(describing: response.error))")
completion(nil, nil, nil)
我不想遍历数组的所有元素并将它们放在另一个具有正确结构的元素中。有没有其他方法可以改变数组的结构?
【问题讨论】:
【参考方案1】:首先请遵守结构和类名以大写字母开头并且是驼峰式的命名约定。以单数形式进一步命名结构。就语言语义而言,您正在创建一个BrandModel
,而不是一个BrandModels
如果您需要在符合Decodable
的结构中添加自定义成员,则必须指定CodingKeys
在大多数情况下,将解码后的结构成员声明为常量就足够了 (let
)
struct Brand: Decodable
private enum CodingKeys : String, CodingKey
case id, name, sort, num, models
var isExpanded = false
let id: String
let name: String
let sort: String
let num: Int
let models: [BrandModel]
struct BrandModel: Decodable
private enum CodingKeys : String, CodingKey
case id, name, num
var isExpanded = false
let id: String
let name: String
let num: Int
【讨论】:
感谢您的澄清和决定。效果很好)) @vadian 切换isExpanded
初始值并使用UserDefaults
保存它。当我稍后解码保存的数据时,它会将所有isExpanded
返回为false
。如何解决?跨度>
@Dilan 因为isExpanded
不在CodingKeys
中,所以它不会被保存。具体解决方案取决于上下文【参考方案2】:
一个简单的解决方案是解析您的 JSON,然后通过迭代每个品牌来添加预期的新字段。最后,您必须将对象字符串化回 JSON。
1. var obj = JSON.parse(' your json '); parse object
2. obj.brands(2)["isExpanded"] = false; add new propertie
3. JSON.stringify(obj) convert back to JSON
【讨论】:
以上是关于如何在json数组结构中添加附加字段的主要内容,如果未能解决你的问题,请参考以下文章