Парсинг через SwiftyJson


#1

Всем привет! Помогите разобраться с парсингом

{
    "terms": [
        {
            "term": {
                "tid": "1",
                "vid": "2",
                "title": "male"
            }
        },
        {
            "term": {
                "tid": "2",
                "vid": "2",
                "title": "female"
            }
        },
        {
            "term": {
                "tid": "3",
                "vid": "3",
                "title": "Ukraine"
            }
        },
        {
            "term": {
                "tid": "4",
                "vid": "3",
                "title": "Poland"
            }
        }
]
}

Из этих данных мне нужно вытащить значения с vid и в зависимости от значения помещать их в разные словари (vid == 2 в gender, vid == 3 language)
Парсинг происходит вот так

    URLSession.shared.dataTask(with: URL(string: NetworkingProvider.termsURL)!, completionHandler: { (data, response, error) in
            guard let data = data, error == nil else { return }

            let json = JSON(data)
            let terms = json["terms"]

[
  {
    "term" : {
      "tid" : "1",
      "title" : "male",
      "vid" : "2"
    }
  },
  {
    "term" : {
      "tid" : "2",
      "title" : "female",
      "vid" : "2"
    }
  },
  {
    "term" : {
      "tid" : "3",
      "title" : "Ukraine",
      "vid" : "3"
    }
  },
  {
    "term" : {
      "tid" : "4",
      "title" : "Poland",
      "vid" : "3"
     }
   }
 }
]

Как дальше фильтровать по ключу vid и сохранять в словари?


#2
terms.forEach { term: Term in
   if term.vid == 2 {
      gender.add(term)
   }
   else {
      language.add(term)
   }
}

#3

а можно в этом месте подробней?


#4

Я видимо поторопился немного. Не заметил у вас в коде структуры под ответ сервера. Они у вас созданы?
struct Terms
struct Term


#5

Под Term

 struct Term {
var tid: Int!
var title: String!
var vid: Int!

init(tid: Int, title: String, vid: Int) {
}

}


#6

Вам нужно создать 2 структуры

struct Terms {
   let terms: [Term]
}
struct Term {
   let tid: Int
   let title: String
   let vid: Int
}

После чего переделать получение данных от сервера, т.к. вам нужно json ответ преобразовать в ваши структуры, а потом уже как я в первом посте предложил.


#7

Спасибо!!! Пробую)))


#8
class JSON: Codable {
let terms: [TermElement]

init(terms: [TermElement]) {
    self.terms = terms
}
}

class TermElement: Codable {
let term: TermTerm

init(term: TermTerm) {
    self.term = term
}
}

class TermTerm: Codable {
let tid, vid, title: String

init(tid: String, vid: String, title: String) {
    self.tid = tid
    self.vid = vid
    self.title = title
}
}

#9

Тогда уже проще использовать ту же структуру, т.к. у нее по дефолту идет инициализация.