Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将一个JSON连接到另一个JSON_Ios_Json_Swift - Fatal编程技术网

Ios 将一个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>.",

我有两个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>.",
            "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 }
}

  • 活动
    结构中添加
    CodingKeys
    和头像URL的额外成员

    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 }
    } 
    
    CodingKeys
    的目的是只解码前4个结构成员

  • 在第一个数据任务的完成处理程序中,添加第二个数据任务以加载用户数据

  • 使用
    JSONSerialization
    将JSON解码为字典数组
  • 在循环中,获取给定
    用户ID的活动,并更新化身URL
    
  • 然后重新加载表视图
  • 要加载化身图像,您需要一个逻辑来异步下载和缓存图像

这看起来很像是的,我是同一个人,只是忘了登录到那个帐户。我也取得了一些进展,所以我想最好再发一个更具体的问题。再次感谢您的回答!1) 如何将资源文件夹中的图像作为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 }
}