【问题标题】:"Expected to decode Array<Any> but found a dictionary instead." error when parsing nested JSON SwiftUI“应解码 Array<Any>,但找到了字典。”解析嵌套的 JSON SwiftUI 时出错
【发布时间】:2021-06-22 10:56:37
【问题描述】:

当我尝试解析 JSON 时,我收到一条错误提示

“本应解码 Array 但找到了字典。”

我知道平台上有很多此类问题,但没有一个对我有帮助。我尝试将 JSON 更改为只有一个数组,但这使 JSON 本身无效,因此我恢复了更改。非常感谢任何帮助!

这是 JSON:

{
   "campaigns": [
      {
         "id": 1,
         "campaign_name": "Tiktok",
         "campaign_icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/11/d7/70/11d770fa-14d6-e6ee-b118-c273bcf91906/AppIcon_TikTok-1x_U007emarketing-85-220-0-5.png/230x0w.jpg",
         "pay_per_install": "19.8",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F44f871ab-a7de-4bcc-9ecf-4ecadbc5bc83.png?alt=media&token=ea854bfa-5fb7-4b23-b85c-312ae9860338",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F44f871ab-a7de-4bcc-9ecf-4ecadbc5bc83.mp4?alt=media&token=9580e0d2-f07e-4c78-bcab-d1b26d2c525a",
               "tracking_link": "www.plugco.in/tiktok/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F1403e07a-24f0-4fef-9022-ffc433b0e767.png?alt=media&token=cf325104-5736-41e9-b79d-08644f79da8b",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F1403e07a-24f0-4fef-9022-ffc433b0e767.mp4?alt=media&token=e11aa682-482e-45f5-875e-06c60da8f04b",
               "tracking_link": "www.plugco.in/tiktok/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F47766c1f-e280-428f-a22d-e9cf8765e259.png?alt=media&token=ae393f4e-ca3f-42d7-aa55-25f3285d73c5",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F47766c1f-e280-428f-a22d-e9cf8765e259.mp4?alt=media&token=3adb2011-a671-4ff0-9230-3d6c3b16ad97",
               "tracking_link": "www.plugco.in/tiktok/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F5868ea0f-abd2-495b-a8bc-cf169d547d13.png?alt=media&token=46347dca-1a68-41dc-8d0c-2fcffd8bb9ed",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/tiktok%2F5868ea0f-abd2-495b-a8bc-cf169d547d13.mp4?alt=media&token=ea11ceef-371d-4e30-b7df-7694e63bd69f",
               "tracking_link": "www.plugco.in/tiktok/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 2,
         "campaign_name": "Yarn",
         "campaign_icon_url": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/17/77/65/17776586-c576-6a59-ede3-15790fe01d02/source/512x512bb.jpg",
         "pay_per_install": "22.1",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/yarn2%2Fd7615446-66f7-49be-b495-0c5f59153553.png?alt=media&token=08feaad6-eb0f-451c-820a-e3f9b0f78f89",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/yarn2%2Fd7615446-66f7-49be-b495-0c5f59153553.mp4?alt=media&token=bf3b8bdd-6715-4c59-8925-e7a13fcb9218",
               "tracking_link": "www.plugco.in/yarn2/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/yarn2%2Fdf36a0cb-14c6-4cc2-a6d8-5797353ad7b6.png?alt=media&token=00429e77-9062-47ca-a3b9-ff604eda9a0a",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/yarn2%2Fdf36a0cb-14c6-4cc2-a6d8-5797353ad7b6.mp4?alt=media&token=2c22b307-49ba-4b21-aab9-52e95681e987",
               "tracking_link": "www.plugco.in/yarn2/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/yarn2%2Fe41949f2-cd48-41db-9645-559a60f9092c.png?alt=media&token=43d4b8c8-eed6-4f4b-a438-7bacda80574e",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/yarn2%2Fe41949f2-cd48-41db-9645-559a60f9092c.mp4?alt=media&token=6a920bca-4d55-4fdf-bd27-8af7b461415a",
               "tracking_link": "www.plugco.in/yarn2/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 3,
         "campaign_name": "Pottery",
         "campaign_icon_url": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/d0/a3/64/d0a364f7-3d4f-a05c-bb8e-668992168e05/source/512x512bb.jpg",
         "pay_per_install": "7.2",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2Fa01229b5-e97d-49f4-b82d-1d6d6bc94640.png?alt=media&token=fd2e9c97-89c9-42dd-80b7-967d5ec21da8",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2Fa01229b5-e97d-49f4-b82d-1d6d6bc94640.mp4?alt=media&token=90565087-93d0-4fda-85ce-6ecbc87822e9",
               "tracking_link": "www.plugco.in/pottery/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2F016aa9b1-8de6-4ea8-8404-94f73ecd82ca.png?alt=media&token=98e86303-8618-4e31-9acf-f972e303412d",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2F016aa9b1-8de6-4ea8-8404-94f73ecd82ca.mp4?alt=media&token=c31cd859-efa6-4351-836a-2e92f800808a",
               "tracking_link": "www.plugco.in/pottery/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2Fec6af5c4-af9d-4762-9492-e2b883686011.png?alt=media&token=2871d7ca-0d43-4151-9987-fa1b665be3ee",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2Fec6af5c4-af9d-4762-9492-e2b883686011.mp4?alt=media&token=5b302a40-2c39-42d3-a5e2-7a7d374866cc",
               "tracking_link": "www.plugco.in/pottery/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2F06b80e4b-d32d-42af-94da-12241823d199.png?alt=media&token=96555ee7-d08e-40fe-a38e-c8bd31a80fff",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2F06b80e4b-d32d-42af-94da-12241823d199.mp4?alt=media&token=6f5732e1-2d61-4a20-bbc6-2d906ec1fe20",
               "tracking_link": "www.plugco.in/pottery/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2F1069253b-a226-4afa-8ace-7b7892920367.png?alt=media&token=46176053-6677-4cf7-8d2a-3b15fd37d7b9",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/pottery%2F1069253b-a226-4afa-8ace-7b7892920367.mp4?alt=media&token=a6bf3d90-664b-4876-805f-b657cce67485",
               "tracking_link": "www.plugco.in/pottery/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 4,
         "campaign_name": "Calm",
         "campaign_icon_url": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/02/d5/22/02d522da-69cb-4416-1bc4-9664a01d7e92/source/512x512bb.jpg",
         "pay_per_install": "22.3",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/calm%2F7eb1ab1d-1487-4093-8ea8-0b3d4881870a.png?alt=media&token=e54a4427-cd3e-443d-9f10-a900aca4f552",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/calm%2F7eb1ab1d-1487-4093-8ea8-0b3d4881870a.mp4?alt=media&token=5db1cf3c-de88-41e9-af17-ce470de74d55",
               "tracking_link": "www.plugco.in/calm/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/calm%2F27d2d833-c122-4358-ab46-f2cac5d05aea.png?alt=media&token=b0a1600f-c0a8-4b99-abb7-bf3c6f84670d",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/calm%2F27d2d833-c122-4358-ab46-f2cac5d05aea.mp4?alt=media&token=78b06a34-cfbc-4d92-bc34-1849f09ea211",
               "tracking_link": "www.plugco.in/calm/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/calm%2Fa8b42eb7-eb47-48c6-baf4-f5d3d13afa46.png?alt=media&token=227c82c9-3915-4a47-817f-fa7f67dee57b",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/calm%2Fa8b42eb7-eb47-48c6-baf4-f5d3d13afa46.mp4?alt=media&token=0567d98c-9ce3-4c43-8166-000510941a6e",
               "tracking_link": "www.plugco.in/calm/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 5,
         "campaign_name": "Jetpack Jump",
         "campaign_icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/5b/23/75/5b2375b9-1055-274f-7227-72001ab04cdf/source/512x512bb.jpg",
         "pay_per_install": "8.9",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/jetpackjump%2F5dc93f2b-377d-4e28-b145-5f930e45218f.png?alt=media&token=118431e2-05a3-4fb5-b793-5f7d69ae46be",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/jetpackjump%2F5dc93f2b-377d-4e28-b145-5f930e45218f.mp4?alt=media&token=ffe53a20-40d7-40b0-a6a7-2de82de57ca0",
               "tracking_link": "www.plugco.in/jetpackjump/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/jetpackjump%2F4368bbd1-3123-4240-a042-a6a511a52b4a.png?alt=media&token=0939c688-0f01-45ad-9013-3b348e96e456",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/jetpackjump%2F4368bbd1-3123-4240-a042-a6a511a52b4a.mp4?alt=media&token=97c46646-a7f5-4184-b12f-f72784372756",
               "tracking_link": "www.plugco.in/jetpackjump/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/jetpackjump%2F3a804ca5-0126-48c6-80e0-f76bc5a58323.png?alt=media&token=2c7b85bb-7b09-43bc-89c4-84764cf489ad",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/jetpackjump%2F3a804ca5-0126-48c6-80e0-f76bc5a58323.mp4?alt=media&token=64141643-6d0a-43c6-a73b-0845761a13f0",
               "tracking_link": "www.plugco.in/jetpackjump/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 6,
         "campaign_name": "Astrology & Palmistry Coach",
         "campaign_icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/27/27/43/272743a4-ed0d-d9aa-03d9-29f6836d89a2/source/512x512bb.jpg",
         "pay_per_install": "6.1",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/astrologyandpalmistrycoach%2F8f80d4b5-d484-4dd0-90bf-b08ef775f7d6.png?alt=media&token=8d45dca1-5ed8-4d0b-a183-ffd1213d7114",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/astrologyandpalmistrycoach%2F8f80d4b5-d484-4dd0-90bf-b08ef775f7d6.mp4?alt=media&token=5b277edf-18d0-4c2d-b9e8-a139eb429729",
               "tracking_link": "www.plugco.in/astrologyandpalmistrycoach/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/astrologyandpalmistrycoach%2Ff0545298-ee7c-4327-86d8-8860ab64dc47.png?alt=media&token=16833b18-9162-4818-ac42-838fdb983669",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/astrologyandpalmistrycoach%2Ff0545298-ee7c-4327-86d8-8860ab64dc47.mp4?alt=media&token=75464b4d-c864-4077-97c0-566af2eae5fc",
               "tracking_link": "www.plugco.in/astrologyandpalmistrycoach/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/astrologyandpalmistrycoach%2F368ea7ea-134e-4248-8f5b-7f0a9c80b978.png?alt=media&token=95f610fa-7ca9-4fab-8040-a90e3d75e43d",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/astrologyandpalmistrycoach%2F368ea7ea-134e-4248-8f5b-7f0a9c80b978.mp4?alt=media&token=ce04556c-c08c-46f1-a161-6b07c98accd1",
               "tracking_link": "www.plugco.in/astrologyandpalmistrycoach/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 7,
         "campaign_name": "Joyride",
         "campaign_icon_url": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/1f/8d/eb/1f8debde-05e1-52e1-e2f5-8e9f8584f38f/source/512x512bb.jpg",
         "pay_per_install": "12.0",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F44a8212a-f283-45e5-9ae0-70a95a874882.png?alt=media&token=746ef8ae-25fd-448b-844a-c8d232626adc",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F44a8212a-f283-45e5-9ae0-70a95a874882.mp4?alt=media&token=1b802d64-c9de-44d5-b877-38fb0c6d27e4",
               "tracking_link": "www.plugco.in/joyride/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2Ff480bc14-e15d-4a9d-b203-9744f75d2f7c.png?alt=media&token=48b5096f-5bc4-43a5-a280-c27627c88e27",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2Ff480bc14-e15d-4a9d-b203-9744f75d2f7c.mp4?alt=media&token=79c12670-9c48-4fe6-8789-41c44a856efc",
               "tracking_link": "www.plugco.in/joyride/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F63233363-f7c6-4ecf-87ec-99b220110f66.png?alt=media&token=5e93dc49-95db-44a4-b309-a83e43977f97",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F63233363-f7c6-4ecf-87ec-99b220110f66.mp4?alt=media&token=8bb85e9f-25bb-4804-9905-d4b71a5619a9",
               "tracking_link": "www.plugco.in/joyride/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F96f3d019-9ff9-48ad-abea-338c3c88551a.png?alt=media&token=41f21e54-d27b-4272-b587-32a0f6949a68",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F96f3d019-9ff9-48ad-abea-338c3c88551a.mp4?alt=media&token=71e37507-bad4-4a62-b8d8-9b089589459f",
               "tracking_link": "www.plugco.in/joyride/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F5aa6206d-ae74-4271-b468-5538802e7632.png?alt=media&token=ce3867d0-86e3-4fd5-a367-3674cce5776e",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/joyride%2F5aa6206d-ae74-4271-b468-5538802e7632.mp4?alt=media&token=c0099724-dcf7-429e-9062-9f2726ea460d",
               "tracking_link": "www.plugco.in/joyride/2",
               "media_type": "video"
            }
         ]
      },
      {
         "id": 8,
         "campaign_name": "Rope 'n' Roll",
         "campaign_icon_url": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/af/1c/2f/af1c2fdd-a45e-f09a-5d4e-4358052003d4/source/512x512bb.jpg",
         "pay_per_install": "9.9",
         "medias": [
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/ropenroll%2Fbe875036-e947-421b-b6c7-57c403eb2e9e.png?alt=media&token=c1b43e34-5fbf-430f-9068-98e7c8006af9",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/ropenroll%2Fbe875036-e947-421b-b6c7-57c403eb2e9e.mp4?alt=media&token=919a590d-f604-49e0-bd4e-63a987f1df92",
               "tracking_link": "www.plugco.in/ropenroll/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/ropenroll%2Fdff1e39c-0f73-48f5-a8fa-a688b28b4c21.png?alt=media&token=71846d7a-98cb-46d1-be07-23d6c950f409",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/ropenroll%2Fdff1e39c-0f73-48f5-a8fa-a688b28b4c21.mp4?alt=media&token=3b6dc3ef-c572-4e93-aafe-d81d27bf09ed",
               "tracking_link": "www.plugco.in/ropenroll/2",
               "media_type": "video"
            },
            {
               "cover_photo_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/ropenroll%2F4bb64dd4-6661-41ce-a3e1-574fbea1c34f.png?alt=media&token=bf24acb2-51db-4632-8dd6-29bfcafebe6c",
               "download_url": "https://firebasestorage.googleapis.com/v0/b/plugcoinprod.appspot.com/o/ropenroll%2F4bb64dd4-6661-41ce-a3e1-574fbea1c34f.mp4?alt=media&token=db2a2957-2aa4-4074-8c1e-d4c122638d0a",
               "tracking_link": "www.plugco.in/ropenroll/2",
               "media_type": "video"
            }
         ]
      }
   ]
}

这是我的数据结构(我是新手,所以不确定是否需要同时使用 Hashable 和 Decodable 协议):

struct Campaigns: Hashable, Decodable{
    
    var campaigns: [Campaign]
}

struct Campaign: Hashable, Decodable{
    var id: Int
    var campaign_name: String
    var campaign_icon_url: String
    var pay_per_install: Float
    var medias: [Media]
}

struct Media: Hashable, Decodable{
    var cover_photo_url: String
    var download_url: String
    var tracking_link: String
    var media_type: String
}

我正在使用一个非常基本的解码器,从 Apple Developer 复制而来(这是“为了好玩”类型的项目):

import Foundation

var campaigns: [Campaign] = load("campaigns.json")

func load<T: Decodable>(_ filename: String) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
        fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

这是我得到的完整错误:

致命错误:无法将campaigns.json 解析为数组: typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "期望解码 Array 但找到了一个字典。",底层错误: nil)): 文件 JetfueltakeHome/ModelData.swift, 第 30 行 2021-03-25 10:24:50.666982-0500 JetfueltakeHome[4673:620620] 致命错误:无法将campaigns.json解析为数组: typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "预期解码 Array 但找到了一个字典。",底层错误: nil)): 文件 JetfueltakeHome/ModelData.swift, 第 30 行

【问题讨论】:

  • 在我看来,这更多的是理解泛型而不是解码 json。当您将campaigns 声明为一个数组并以该数组作为结果调用通用load 方法时,您就是在告诉编译器T 是一个数组,即T: [Campaigns],所以这就是编译器正在尝试的解码时使用,decoder.decode([Campaign].self, from: data)
  • 谢谢!这进一步澄清了这一点。我对 Swift 和 SwiftUI 很陌生,所以我可以看到我的问题有点愚蠢)

标签: ios arrays json swift dictionary


【解决方案1】:

你实际上应该使用Campaigns

var campaignsResult: Campaigns = load("campaigns.json")

稍后使用 campaignsResult.campaigns 访问实际的活动条目。


您当前加载到 [Campaign] 中,因此您声明您希望在顶层有一个与实际 json 数据不匹配的数组,这反过来会导致错误指出数组和字典之间不匹配。

【讨论】:

  • 您的回答确实有效,但随后出现了另一个问题,我无法再访问数据了。比如说,我想要一个文本视图,其中包含“campaign_name”作为文本。我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2019-09-11
  • 2021-11-06
相关资源
最近更新 更多