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