1

我有一个类似这样的 JSON 数据。我使用了一种单独的结构方法,而不是在一个单独的结构中使用嵌套键。需要注意的一点是Given Json中的key不一致,可能不存在。因此,在尝试使用构建的结构解析它之前,必须对每个键进行检查。

 {  "ProductInfo": [
      {
        "productCode": "ABC",
        "productWeight": "2.3",
      }
    ],
    "ProductService": [
      {
        "serviceCode": "00",
        "serviceSite": 0
      }],

"ProductName": "StackSite"
}

解析这个我已经创建了像这样的快速结构

struct ProductStructure: Decodable{
var ProductInfo: productInfo
var ProductService: [productService]
var ProductName:String

enum ProductStructureKeys: String , CodingKey{
case ProductInfo
case ProductService
case ProductName

}

struct productInfo : Decodable {
   var productCode:String
   var productWeight:String
}

struct ProductService : Decodable {
    var serviceCode:String
    var serviceSite: Int
}


**// the decoder for the Main Structure**
extension ProductStructure{
  init(from decoder: Decoder) throws {

let container = try decoder.container(
      keyedBy: ProductStructureKeys.self)

//checks if product name key is present
 let product: String = try container.decodeIfPresent(String.self, forKey: . ProductName)


*//What code should I put here to check if my other two structures are present and parse them if they are present.* 

}
4

1 回答 1

1

最简单的解决方案是将属性声明为可选的(productInfo并且productService名称以小写字母开头)。顺便说一句,两个对象都是数组

struct ProductStructure: Decodable {
    let productInfo: [ProductInfo]?
    let productService: [ProductService]?
    let productName: String

    enum CodingKeys: String, CodingKey {
        case productInfo = "ProductInfo"
        case productService = "ProductService"
        case productName = "ProductName" 
    }

    struct ProductInfo : Decodable {
        let productCode: String
        let productWeight: String
    }

    struct ProductService : Decodable {
        let serviceCode: String
        let serviceSite: Int
    }
}

如果 key serviceCodeinProductService也可能丢失,则以与 optional 相同的方式声明该属性

 let serviceCode: String?

不需要自定义初始化程序,假设data包含 JSON 作为Data

let productStructure = try decoder.decode(ProductStructure.self, from: data)
于 2017-12-06T12:51:50.213 回答