Декодирование JSON с массивами вызывает ошибку, если массив содержит только одну запись

У меня есть JSON:

{
    "data": [
        {
            "provider_metadata": {
                "filename": "kolabree-demo-pdf-upload.pdf"
            },
            "name": "pdf file",
            "description": "<p>dsadasdasd</p>",
            "enabled": false,
            "provider_name": "kol.media.provider.pdf",
            "provider_status": 1,
            "provider_reference": "17dc7f2aecffb8feac8a7e383b014667fccc8d90.pdf",
            "context": "pdf_file",
            "cdn_is_flushable": false,
            "updated_at": "2021-07-04T17:11:14+00:00",
            "created_at": "2021-07-04T17:11:14+00:00",
            "content_type": "application/pdf",
            "size": 14317593,
            "id": "43720ba7-3fb5-4104-ba1a-bd2380c25956",
            "cover_image_url": "/upload/media/kolmedia/files/default_cover/pdf.png"
        },
        {
            "provider_metadata": [],
            "name": "Media Name1625389920569",
            "description": "description of media",
            "enabled": true,
            "provider_name": "kol.media.provider.image",
            "provider_status": 3,
            "provider_reference": "missing_binary_content",
            "context": "default",
            "cdn_is_flushable": true,
            "updated_at": "2021-07-04T09:12:02+00:00",
            "created_at": "2021-07-04T09:12:02+00:00",
            "content_type": null,
            "size": null,
            "id": "baab338d-f6f6-491c-9b70-9592284693e4",
            "cover_image_url": "/upload/media/default/baab/33/thumb_baab338d-f6f6-491c-9b70-9592284693e4_default_cover.jpg"
        }
    ]
}

Как видите, provider_metadata - это массив. А когда в нем только одна запись, квадратная скобка не обозначает, что это массив. Это можно правильно проанализировать в PHP. Я пробовал его в сети проверки JSON, и он считается действительным.

Однако, когда я хочу декодировать его в своем приложении iOS с помощью JSONDecoder, он не сработал с этой ошибкой:

сбой: обнаружена ошибка: typeMismatch (Swift.Array, Swift.DecodingError.Context (codingPath: [CodingKeys (stringValue: data, intValue: nil), _JSONKey (stringValue: Index 0, intValue: 0), CodingKeys (stringValue: providerMetadata, : nil)], debugDescription: Ожидалось декодирование массива, но вместо этого был найден словарь., lowerError: nil))

Это ожидаемое поведение JSONDecoder? Если да, то как мне это правильно разобрать? Потому что я спросил специалиста по серверной части, и он сказал, что именно так это реализовано в серверной части и в веб-приложении. И все работало нормально. Так что измениться с их стороны будет сложно. Один из способов, который я могу придумать, - это проанализировать JSON и вставить сами квадратные скобки в JSON перед его декодированием. Но это будет утомительно и потребует некоторого времени на обработку перед декодированием. Есть ли другие предложения? Спасибо.


person Bawenang Rukmoko Pardian Putra    schedule 08.07.2021    source источник
comment
Смотрите мой ответ в дубликате. Оболочка свойств MultipleOrSingle должна делать именно то, что вы хотите.   -  person Sweeper    schedule 08.07.2021
comment
echo json_encode(array()); даст вам [] И echo json_encode(new ArrayObject()); даст вам {}. Я настоятельно рекомендую изменить его, если это возможно. [] не является правильным представлением ваших данных для provider_metadata json.   -  person Tarun Tyagi    schedule 08.07.2021
comment
"provider_metadata": [] - это Array<Element> в Swift, а "provider_metadata": {} - это Dictionary<Key, Value> Обе конструкции в Swift очень разные, хотя в PHP может показаться, что они очень близки - индексированные / ассоциативные массивы.   -  person Tarun Tyagi    schedule 08.07.2021