Ios 将一个JSON连接到另一个JSON
我有两个JSON,它们共享一个字段Ios 将一个JSON连接到另一个JSON,ios,json,swift,Ios,Json,Swift,我有两个JSON,它们共享一个字段userId 这个: { "oldest": "2019-01-24T00:00:00+00:00", "activities": [ { "message": "<strong>Henrik</strong> didn't resist a guilty pleasure at <strong>Starbucks</strong>.",
userId
这个:
{
"oldest": "2019-01-24T00:00:00+00:00",
"activities": [
{
"message": "<strong>Henrik</strong> didn't resist a guilty pleasure at <strong>Starbucks</strong>.",
"amount": 2.5,
"userId": 2,
"timestamp": "2019-05-23T00:00:00+00:00"
},
{
"message": "<strong>Johan</strong> made a roundup.",
"amount": 0.32,
"userId": 3,
"timestamp": "2019-05-22T00:00:00+00:00"
},
{
"message": "<strong>You</strong> didn't resist a guilty pleasure at <strong>Starbucks</strong>.",
"amount": 15,
"userId": 1,
"timestamp": "2019-05-21T00:00:00+00:00"
}
]
现在我把第一个分类如下:
struct Root: Decodable {
var oldest: Date
var activities: [Activity]
}
struct Activity: Decodable {
var message: String
var amount: Float
var userId: Int
var timestamp: Date
}
请注意,活动(第一个JSON)中的userId
var也出现在第二个JSON上。我正在使用这些结构来填充我的
我最终需要的是在消息和日期标签旁边显示化身图像(检查图像)。为此,我想我需要将第一个JSON与第二个JSON连接/关联(不知道这个词的意思),如果我错了,请纠正我。我是否还需要为用户提供另一个结构
这是我的网络代码:
let userJSONURLString = "https://qapital-ios-testtask.herokuapp.com/users"
let activitiesJSONURLString = "https://qapital-ios-testtask.herokuapp.com/activities?from=2016-05-23T00:00:00+00:00&to=2019-05-23T00:00:00+00:00"
guard let userURL = URL(string: userJSONURLString) else { return }
guard let activitiesURL = URL(string: activitiesJSONURLString) else { return }
URLSession.shared.dataTask(with: activitiesURL) { (data, response, err) in
// perhaps check err
// also perhaps check response status 200 OK
guard let data = data else { return }
do {
// Activities
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let result = try decoder.decode(Root.self, from: data)
self.activities = result.activities
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error serializing json: ", error)
}
}.resume()
这是我的手机号码(如果你需要):
更新代码:
struct Activity: Decodable {
var message: String
var amount: Float
var userId: Int
var timestamp: Date
var avatar : UIImage = UIImage(named: "user-icon-image-placeholder-300-grey.jpg")!
private enum CodingKeys : String, CodingKey { case message, amount, userId, timestamp }
}
- 在
结构中添加活动
和头像URL的额外成员CodingKeys
struct Activity: Decodable { let message: String let amount: Float let userId: Int let timestamp: Date var avatar : URL = // some default URL to a placeholder image on disk private enum CodingKeys : String, CodingKey { case message, amount, userId, timestamp } }
的目的是只解码前4个结构成员CodingKeys
- 在第一个数据任务的完成处理程序中,添加第二个数据任务以加载用户数据
- 使用
将JSON解码为字典数组李>JSONSerialization
- 在循环中,获取给定
用户ID的活动,并更新化身URL李>
- 然后重新加载表视图李>
- 要加载化身图像,您需要一个逻辑来异步下载和缓存图像
let path=Bundle.main.path(forResource:“user-icon-image-placeholder-300-grey”,类型为:“jpg”,inDirectory:“Assets.xcsets”)var-avatar:URL=URL(fileURLWithPath:path!)
但它在路径上抛出了一个零代码>,文件名与此完全相同,我进行了三次检查。2) 对于JSONSerialization
部分,与解码器类似吗let serializer=JSONSerialization()
?如果是,让userResult=serializer。
似乎不正确。我想我可能做错了。请做些调查:关于如何使用JSONSerialization
,有无数的问题。不,它不像JSONDecoder
。您还可以使用UIImage
类型而不是URL
,并使用UIImage获取图像(名为
Alrighty。当你说添加第二个数据任务来加载用户数据时,你的意思是在DispatchQueue
之前?我不应该打开另一个URLSession
?你必须在同一个共享会话上添加另一个数据任务嘿,我想我知道了,我在帖子中编辑了代码,你能检查一下并告诉我是否在共享会话上吗正确路径?如果
struct Activity: Decodable {
var message: String
var amount: Float
var userId: Int
var timestamp: Date
var avatar : UIImage = UIImage(named: "user-icon-image-placeholder-300-grey.jpg")!
private enum CodingKeys : String, CodingKey { case message, amount, userId, timestamp }
}
URLSession.shared.dataTask(with: activitiesURL) { (data, response, err) in
guard let data = data else { return }
do {
// Activities
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let result = try decoder.decode(Root.self, from: data)
self.activities = result.activities
URLSession.shared.dataTask(with: userURL) { (data, response, err) in
guard let data = data else { return }
do {
// Users
let usersJson = try JSONSerialization.jsonObject(with: data, options: [])
guard let jsonArray = usersJson as? [[String: Any]] else { return }
for dic in jsonArray {
guard let avatarUrl = dic["avatarUrl"] as? String else { return }
print(avatarUrl)
}
} catch {
print("Error serializing json: ", error)
}
}.resume()
} catch {
print("Error serializing json: ", error)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}.resume()
struct Activity: Decodable {
let message: String
let amount: Float
let userId: Int
let timestamp: Date
var avatar : URL = // some default URL to a placeholder image on disk
private enum CodingKeys : String, CodingKey { case message, amount, userId, timestamp }
}