json - 如何在swift中反序列化JSON

标签 json swift

我想将 JSON 文件解码为模型对象。不幸的是它没有以正确的方式工作。所以我没有收到错误,但“解码结果”不符合我的期望。 我有以下 JSON 文件,我想在显示的结构中对其进行解码。我已经修剪了 json 文件。为什么我只得到一个“ slider 图像”而不是 5 个(ImagesSlider 的属性图像包含一个仅包含第一个图像/元素的数组)。 我错过了什么?

JSON:

[{"imageSlider" : [{
        "image" : [{
             "imageId" : "1",
             "imageName" : "germany1",
             "imageBigName" : "germany1_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "2",
             "imageName" : "germany2",
             "imageBigName" : "germany2_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "3",
             "imageName" : "germany3",
             "imageBigName" : "germany3_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "4",
             "imageName" : "germany4",
             "imageBigName" : "germany4_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "5",
             "imageName" : "germany5",
             "imageBigName" : "germany5_BIG",
             "imageRights" : "Peter"
        }]
    }]
}]

swift :

struct CountryModel : Decodable, Equatable {    
    var countryName : String
    var inhabitants : String
    var capital : String
    var currency : String
    var imageName : String
    var imageSlider: [ImagesSlider]
}

struct ImagesSlider : Decodable, Equatable {
    var image: [Image]
}

struct Image : Decodable, Equatable {
    var imageId: String
    var imageName: String
    var imageBigName: String
    var imageRights: String
}

解码:

func loadData() -> [CountryModel] {
    var data: Data

    guard let file = Bundle.main.url(forResource: "data", withExtension: "json") else {
        fatalError("Error")
    }

    data = try! Data(contentsOf: file)
    let decoder = JSONDecoder()
    return try! decoder.decode([CountryModel].self, from: data)

}

感谢您的帮助...

编辑: 我的问题没有通过链接的问题解决...

最佳答案

json 看起来错误,请记住每个 json 对象应该只有一个唯一键。现在是:

[
  {
    "imageSlider": [
      {
        "image": [
          {
            "imageId": "1",
            "imageName": "germany1",
            "imageBigName": "germany1_BIG",
            "imageRights": "Peter"
          }
        ],
        "image": [
          {
            "imageId": "2",
            "imageName": "germany2",
            "imageBigName": "germany2_BIG",
            "imageRights": "Peter"
          }
        ]
      }
    ]
  }
]

它应该是这样的:

[
    {
      "imageSlider": [
        {
          "image": [
            {
              "imageId": "1",
              "imageName": "germany1",
              "imageBigName": "germany1_BIG",
              "imageRights": "Peter"
            },
            {
              "imageId": "2",
              "imageName": "germany2",
              "imageBigName": "germany2_BIG",
              "imageRights": "Peter"
            }
          ]
        }
      ]
    }
  ]

请注意,“germany2”项位于图像数组内部。

let decoder = JSONDecoder()
let jsonData = Data(jsonString.utf8)
do {
  let country = try decoder.decode([CountryModel].self, from: jsonData)
  print(country[0].imageSlider[0].image.count)
} catch {
  print(error.localizedDescription)
}

// Console message
2

关于json - 如何在swift中反序列化JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250945/

相关文章:

javascript - Flot:堆叠条形标签重叠/不显示

python - 解析 JSON 以查找键的值

java - 从文本文件解析 JSON 数据

ios - 快速 TextView 和标签在 UITableviewcell 中返回空文本

ios - 游戏激活时运行函数 iOS - SpriteKit

jquery - 使用序列化数据 (JSON) 作为输入构建 gridster 布局

ios - 如何使用 ios Swift 3 从 SOAP 网络服务方法获取 json 数组字符串?

swift - 如何达到 childByAutoId() 背后的值(value)

ios - 当多个 UIView 相互重叠时,甚至在顶部 UIView 上拦截点击

ios - Firestore 应用程序不会回调