【问题标题】:Parse local json file to object将本地 json 文件解析为对象
【发布时间】:2018-11-01 04:54:06
【问题描述】:

我有这个代码:

struct ProductObject : Codable {
    let palletHeight : Double?
    let layerPallet : Int?
    let prepCombisteamer : String?
    let id : Int?
    let avikoWorlds : [String]?
    let avikoSegments : [String]?
    let sunFlower : Bool?
    let inPieces : Bool?
    let noBox : Int?
    let prepFryingPan : String?
    let packageContents : Double?
    let carbohydrates : Int?
    let fat : Double?
    let eanBox : Int?
    let weightYieldPercent : Int?
    let kcal : Int?
    let markedAsFavourite1 : Bool?
    let avikoPodSegmentyRynku : [String]?
    let prepPot : String?
    let prepMicrowave : String?
    let name : String?
    let code : Int?
    let prepDeepFryer : String?
    let avikoConcepts : [String]?
    let boxLayer : Int?
    let avikoSegmentyRynku : [String]?
    let active : Bool?
    let shelfLifeTimeFrame : String?
    let markedAsFavourite2 : Bool?
    let palletWeight : Double?
    let changeTime : ChangeTime?
    let kj : Int?
    let langVersions : [LangVersions]?
    let proteins : Double?
    let markedAsFavourite3 : Bool?
    let containsGluten : Bool?
    let regions : [Int]?
    let eanFoil : Int?
    let shelfLife : Int?
    let contentPerBox : Int?
    let prepOven : String?
}
func downloadImagesFromJsonProductFile(fileName: URL){

        let filePath = fileName.path
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: filePath) {
            do {
                let data = try Data(contentsOf: fileName)
                let jsonData = try JSONDecoder().decode(ProductObject.self, from: data)

            } catch let error {
                self.errorLoginMessage(txt: "MainView - Error 109: Problem with parse file \(error)", title: "Blad".localized())
            }
        }
    }

downloadImagesFromJsonProductFile(fileName: documentsDir.appendingPathComponent((AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json/products.json"))

我的本​​地json文件:https://files.fm/u/73n845ty

当我运行函数时:downloadImagesFromJsonProductFile 我有错误 (当应用程序启动时):解析文件类型不匹配(Swift.Dictionary,Swift.DecodingError.Context(coding-path:[],debugDescription:“期望解码字典但找到一个数组。”,基础错误:将)。

如何解决?

【问题讨论】:

  • 让 jsonData = try JSONDecoder().decode([ProductObject].self, from: data)

标签: ios json swift swift3


【解决方案1】:

当我在这里查看您的 JSON http://json.parser.online.fr/ 时,有一个数组作为根对象,因此您应该这样做

let json = try JSONDecoder().decode([ProductObject].self, from: data)

更新

请从这里json4swift创建JSON struct Codable,请先解决类型不匹配错误,否则您的JSON无法解析,您将收到类型不匹配错误。

您可以通过以下方式获取产品代码,

let jsonData = try JSONDecoder().decode([ProductObject].self, from: data)

for detail in jsonData {
    print(detail.code ?? "")
}

【讨论】:

  • 它工作正常。在此之后我该如何迭代?对于 jsonData 中的产品 { 对于产品中的 productDetails { print("Product code : (productDetails.code)") } } 不起作用:(我有错误:类型“ProductsObject”不符合协议“Sequence”
  • jsonData 本身包含 ProductObject
  • 你能告诉我怎么做吗?我需要打印所有 productDetails.code
  • 给我几分钟
  • 谢谢。我在打印行中有错误:“ProductsObject”类型的值没有成员“代码”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多