У меня есть данные JSON типа Array of Dictionaries. Как использовать протокол Codable для его декодирования? - PullRequest
0 голосов
/ 08 июля 2019
[
{
"status":"ok"
},
{
"feeds":[
{
"id":"68",
"userby":"1",
"usertype":"Registered    Students",
"content":"test",
"total_likes":"0",
"total_comments":"0",
"video_url":"(Some_URL)",
"image_url":"",
"created_date":"2019-06-26    20:34:02",
"modified_date":"0000-00-00    00:00:00",
"is_active":"Y",
"is_deleted":"N",
"feed_id":"68",
"user_name":"M    Y",
"profile_image":"(some_URL)",
"is_liked":"N"
}, //And so on feed entries...! ]}]    



// The Structure I tried using. 

typealias FeedDataDict = [FeedData]

struct FeedData : Codable {
    var status : String
    var feeds : [Feed]

}


let decoder = JSONDecoder()
let content = try decoder.decode( FeedDataDict.self , from: data)
print ( content[0].feeds[0].id )

Я попытался добавить структуру в массив и использовал индекс 0 для доступа к ней.однако это вызывает у меня проблемы, говоря, что значения в индексе были найдены ноль.

Я ожидаю сбора всех значений, присутствующих в данных.

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Я хочу добавить в ответ @ Sh_Khan кое-что, что ваши данные JSON не в правильном формате, хотя они будут работать, но должны быть в формате, подобном

{
  "status": "ok",
  "feeds": [
    {
      "id": "68",
      "userby": "1",
      "usertype": "Registered    Students",
      "content": "test",
      "total_likes": "0",
      "total_comments": "0",
      "video_url": "https:\/\/medicalcosmetology.org.md-64.webhostbox.net\/adminpanel\/uploads\/feed\/videos\/V_20190514_1151392.mp4",
      "image_url": "",
      "created_date": "2019-06-26    20:34:02",
      "modified_date": "0000-00-00    00:00:00",
      "is_active": "Y",
      "is_deleted": "N",
      "feed_id": "68",
      "user_name": "M    Y",
      "profile_image": "https:\/\/medicalcosmetology.org.md-64.webhostbox.net\/adminpanel\/uploads\/user\/2eee0e67c31427fc5be42147ed9664b3.png",
      "is_liked": "N"
    }
  ]
}

Как только вы получите правильный JSON, попробуйте разобрать его, как показано ниже:

let decoder = JSONDecoder()
let content = try decoder.decode( FeedDataDict.self , from: data)
print ( content.feeds[0].id )

Но если вы не хотите его менять, тогда ответьте @ Sh_Khan.

0 голосов
/ 08 июля 2019

Мне кажется, что ваш json - это массив словарей, так что если вы сделаете

do {
    let content = try JSONSerialization.jsonObject(with: data) as! [[String: Any]]
} catch {
    print(error)
}

Тогда content - это массив, в котором первый индекс содержит ["status": "ok"], а вторым элементом является ваш массив feeds

Вы также можете использовать Codable, используя пользовательский init в FeedData struct

struct FeedData : Codable {
    var status : String?
    var feeds : [Feed]?

    init(from decoder: Decoder) throws {
        var values = try decoder.unkeyedContainer()
        let statusDict = try values.decode([String:String].self)
        status = statusDict["status"]
        let feedsDict = try values.decode([String:[Feed]].self)
        feeds = feedsDict["feeds"]
    }
}
...