簡體   English   中英

swift - 將 JSON 數據保存到本地文件

[英]swift - Save JSON data to local file

我從 Reddit API 收到帖子。 我想對收到的 JSON 進行編碼並將其寫入本地文件。 但是在向其寫入數據后,文件為空。 請建議我如何將編碼的 JSON 數據寫入文件或漂亮的 JSON 數據。

class Utils {
        
        func saveToJSON() {
            
            UseCase().createPosts(sub: "ios", limit: 5, completion: { posts in
                print(posts)
                
                let filePath = self.getDocumentsDirectoryUrl().appendingPathComponent("landmarkData.json")
                print(filePath)
                
                do {
                    let jsonData = try JSONEncoder().encode(posts)
                    print(jsonData)
                    try jsonData.write(to: filePath)
                    // here landmarkData.json file is empty
                } catch {
                    print("Error writing to JSON file: \(error)")
                }
            })
        }
        
        func getDocumentsDirectoryUrl() -> URL {
            let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
            let documentsDirectory = paths[0]
            return documentsDirectory
        }
    }


struct RedditPost: Hashable, Codable, Identifiable {
            var username: String
            var createdHoursAgo: String
            var domain: String
            var title: String
            var text: String
            var imageURL: String
            var downs: Int
            var ups: Int
            var rating: Int { ups - downs }
            var comments: Int
            var saved: Bool = false
            var id: String
     }


class UseCase {
        func createPosts(sub: String, limit: Int, completion: (@escaping (_ data: [RedditPost]) -> Void)) {
            Repository().fillPostsArray(sub: sub, limit: limit) { (redditPosts: [RedditPost]) in
                DispatchQueue.main.async {
                    completion(redditPosts)
                }
            }
        }
}

在此處輸入圖像描述

//Define globally..
let fileName = "landmarkData.json"


func saveToJSON() {
        
        UseCase().createPosts(sub: "ios", limit: 5, completion: { posts in
            print(posts)
            
            let filePath = self.getDocumentsDirectoryUrl().appendingPathComponent(fileName)
            print(filePath)
            
            do {
                let jsonData = try JSONEncoder().encode(posts)
                print(jsonData)
                try jsonData.write(to: filePath)
                // here landmarkData.json file is empty
            } catch {
                print("Error writing to JSON file: \(error)")
            }
        })
    }

然后在讀取文件時使用相同的常量...

func readFromJson() {

    let filePath = self.getDocumentsDirectoryUrl().appendingPathComponent(fileName)
    print(filePath)

    do {
        let jsonData = try JSONDecoder().decode(posts)
        print(jsonData)
     } catch {
         print("Error reading from JSON file: \(error)")
     }
}

我推薦的是使用 Codable 對象,這意味着您可以更高效、更輕松地編寫/保存 json 數據文件並加載回 Codable 對象。

由於代碼行長,我在此處鏈接 GitHub 要點以查看支持此功能的完整 class。

要點: https://gist.github.com/egzonpllana/372d8e8733d90a013532d7377284d70c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM