如何遍历一个对象数组并创建一个 json 对象?
Posted
技术标签:
【中文标题】如何遍历一个对象数组并创建一个 json 对象?【英文标题】:how to loop through an array of objects and create a json object? 【发布时间】:2019-06-27 13:48:23 【问题描述】:我有一个由 300 个对象组成的数组,每个对象包含许多参数,我想遍历数组以创建一个仅包含两个参数的 JSON 对象。我的对象是从数组中的这个 json 结构创建的:
"publicationId": 13,
"name": null,
"code": "FIGA_20190516",
"parutionDate": "2019-05-16",
"quadri": "FIGA",
"ratio": null,
"numero": "0",
"createdAt": "2019-06-18 21:29:21",
"nbPages": 0,
"search": 1,
"down": 1,
"thumb_height": 0,
"quartPageWidth": 0,
"quartPageHeight": 0,
"pdfHeight": "0",
"pdfWidth": "0",
"PDF": "2019-06-18 21:29:21",
"XML": null,
"SendKM": "2019-06-18 21:29:21",
"KM": null,
"Melody": null,
"filename": null,
"SendNormalize": null,
"Normalized": null,
"libreliosubTitle": null,
"SendProcessArticle": null,
"ProcessedArticles": null,
"melodyCallBackUrl": null,
"htmlMilibris": false,
"htmlHarry": false,
"sendProcessLibrelio": null,
"processedLibrelio": null,
"id": 77066,
"_solrDocument": ,
"_repository": "FIGA/2019/05/FIGA_20190516/"
我想循环遍历数组来创建一个带有这个结构的 JSON 对象:
"availableParutions" :
id : createdAt,
id : createdAt,
id : createdAt
非常感谢你们的帮助!
【问题讨论】:
嗨@mark,你从哪里得到JSON数据?服务还是参与项目? 你检查过Codable
吗?
是否和:***.com/questions/42081141/…一样?
嗨@Emre 这是一项服务
嘿@Ahmed 不,这不是同一个结构我可以创建一个对象数组的结构 [obj,obj,obj] 就像您发布的示例一样,但这是另一种格式键:值,键:值,键:值
【参考方案1】:
您可以在 Json 输出中创建一个表示所需数据的新结构
struct NewStruct: Encodable
let id: Int
let createAt: String
这个结构符合 Encodable,因此可以编码为 json,但由于它非常简单,不需要额外编码
然后您可以使用map
将您的大对象数组转换为NewStruct
数组
let newArray = array.map NewStruct(id: $0.id, createAt: $0.createdAt)
如果我理解正确,这个数组应该是一个名为“availableParutions”的属性,所以让我们为 json 创建一个外部结构
struct Output: Codable
let availableParutions: [NewStruct]
并加载它
let output = Output(availableParutions: newArray)
并对其进行编码
do
let jsonData = try JSONEncoder().encode(output)
catch
print(error)
【讨论】:
谢谢 Joakim 你救了我!【参考方案2】:你可以试试下面的代码:
注意:我自己创建了 json obj 用于评估目的,你可以直接使用你的 json。
let json = [
[
"publicationId":11,
"createdAt":"2019-06-18 21:29:21",
"id":77063,
],
[
"publicationId":12,
"createdAt":"2019-06-18 21:29:21",
"id":77065,
],
[
"publicationId":13,
"createdAt":"2019-06-18 21:29:21",
"id":77066,
]
]
var jsonArr: [[String:Any]] = [[String:Any]]()
for obj in json
let id = obj["id"] as! Int
let jsonObj = [
"\(id)": obj["createdAt"] as! String
]
jsonArr.append(jsonObj as [String : Any])
print(jsonArr)
【讨论】:
嘿@Bhavik!谢谢你的回复,所以首先我的数组不包含 json 它包含从传递的 json 格式创建的对象,其次我测试了你的代码,它给了我这种格式:[[“77063”:“2019-06-18 21 :29:21"], ["77065": "2019-06-18 21:29:21"], ["77066": "2019-06-18 21:29:21"]] 但它没有匹配我想要的格式,谢谢你的尝试【参考方案3】:您可以创建一个空字典,然后遍历 json 数组并取出 id
和 createdAt
。使用id
和createdAt
更新字典。最后将此字典设置为新字典中availableParutions
的值。
代码:
var map: [Int: Any] = [:]
for item in json
let id = item["id"] as! Int
map[id] = item["createdAt"]!
let outerObject = ["availableParutions": map]
print(outerObject)
【讨论】:
以上是关于如何遍历一个对象数组并创建一个 json 对象?的主要内容,如果未能解决你的问题,请参考以下文章