0
私はこのようなことをするJSONデータを持っています。私は、単一の構造で非常に構造のためにネストされたキーを持つのではなく、別の構造アプローチを使用しました。注意すべき点は、Given Jsonのキーが一貫性がなく、不在の可能性があるということです。したがって、構築された構造で解析する前に、各キーごとにチェックを行う必要があります。スワイプ解読可能:入れ子構造が存在するかどうかを確認します。
{ "ProductInfo": [
{
"productCode": "ABC",
"productWeight": "2.3",
}
],
"ProductService": [
{
"serviceCode": "00",
"serviceSite": 0
}],
"ProductName": "StackSite"
}
私は最も簡単な解決策はオプション(と小文字で始まる名前を持つ)としての性質productInfo
とproductService
を宣言することですこれらの
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.*
}
と記載されています。productStr APIの観点から見てオプションのキーです。つまり、そのキーはJSONレスポンスに存在していてもいなくてもかまいません。キーが存在しない状態で構造体を直接デコードしようとすると、構造体が崩壊します。 ネストされた構造体に対して同じ検証を行う方法を探しています。 – Vkharb
キー「ProductInfo」または「ProductService」が欠落している場合、その値はデコードされた(プロパティは 'nil'です)。 **(サブ)構造体のプロパティ**が欠落している場合は、それらもオプションとして宣言してください。この動作は、カスタムイニシャライザで 'decodeIfPresent'を使うのとまったく同じです。 – vadian
これは私の要求に対応しているので、私はこの回答を受け入れています。しかし、私は、答えがまっすぐなので、decodeIfPresentの必要性が何であるのか混乱しています – Vkharb