2017-12-06 3 views
0

私はこのようなことをするJSONデータを持っています。私は、単一の構造で非常に構造のためにネストされたキーを持つのではなく、別の構造アプローチを使用しました。注意すべき点は、Given Jsonのキーが一貫性がなく、不在の可能性があるということです。したがって、構築された構造で解析する前に、各キーごとにチェックを行う必要があります。スワイプ解読可能:入れ子構造が存在するかどうかを確認します。

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

"ProductName": "StackSite" 
} 

私は最も簡単な解決策はオプション(と小文字で始まる名前を持つ)としての性質productInfoproductServiceを宣言することですこれらの

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.* 

} 

答えて

1

のような迅速な構造を作成して、これを解析します。ちなみに両方オブジェクトが配列

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 
    } 
} 

があるProductServiceの重要serviceCodeが欠落することができた場合は、あまりにも、プロパティにオプションとして同じように宣言し

let serviceCode: String? 

カスタム初期化子が必要とされていません、 dataには、JSONがData

let productStructure = try decoder.decode(ProductStructure.self, from: data) 
+0

と記載されています。productStr APIの観点から見てオプションのキーです。つまり、そのキーはJSONレスポンスに存在していてもいなくてもかまいません。キーが存在しない状態で構造体を直接デコードしようとすると、構造体が崩壊します。 ネストされた構造体に対して同じ検証を行う方法を探しています。 – Vkharb

+0

キー「ProductInfo」または「ProductService」が欠落している場合、その値はデコードされた(プロパティは 'nil'です)。 **(サブ)構造体のプロパティ**が欠落している場合は、それらもオプションとして宣言してください。この動作は、カスタムイニシャライザで 'decodeIfPresent'を使うのとまったく同じです。 – vadian

+0

これは私の要求に対応しているので、私はこの回答を受け入れています。しかし、私は、答えがまっすぐなので、decodeIfPresentの必要性が何であるのか混乱しています – Vkharb

関連する問題