2016-05-12 2 views
0

Я использую Swift 2 с xcode 7.3.1.как конвертировать из json в объект моего класса и наоборот наоборот (с alamofire, SwiftyJSON)

У меня есть Alamofire 3.4 & SwiftyJSON в моем проекте. Я знаю, что могу преобразовать значение результата ответа от Alamofire к JSON (структура определяется SwiftyJSON) типа, используя следующий код:

Alamofire.request(.GET, url).validate().responseJSON { response in 
    switch response.result { 
    case .Success: 
     if let value = response.result.value { 
      // now I get JSON type object, then what? 
      let json = JSON(value) 
      print("JSON: \(json)") 
     } 
    case .Failure(let error): 
     print(error) 
    } 
} 

Мой вопрос после того, как я получаю json, как я могу преобразовать его в объект пользовательский класс?

Например, json имеет следующую структуру:

{"name": 
"Kate", 
"age": 23, 
"books":[{"id":1,"name":"book-1"},{"id":2,"name":"book-2"}] 
} 

У меня есть Swift класс:

class Student { 
    var name: String! 
    var age: Int! 
    var books:[Book] 
    ... 
} 

class Book { 
    var id: Int! 
    var name: String! 
    ... 
} 

Как я могу конвертировать json в Student объект и наоборот с Alamofire & SwiftyJSON ?

(Я новичок в iOS, я только что нашел людей в Интернете, предложил эти две библиотеки для обработки ответа JSON, поэтому я их использую. Пожалуйста, укажите мне, . заранее спасибо.)

+0

SwiftyJSON, если возможно, преобразует HTTP-запрос в словарь-подобный объект, называемый 'JSON'. Вот и все. Ваша задача - сопоставить объект JSON с фактической моделью вашего приложения. Возможно, вы захотите использовать ['AlamofireObjectMapper'] (https://github.com/tristanhimmelman/AlamofireObjectMapper) над SwiftyJSON в этот момент, чтобы избавить себя от беспорядочного выполнения этого сопоставления. – ozgur

+0

@ozgur, я проверил ссылку AlamofireObjectMapper, похоже, что мне не нужно использовать SwiftyJSON для преобразования строки в 'JSON'. Он непосредственно делает это: «Alamofire.request (.GET, URL) .responseObject {(response: Response )), вы видите, это позволяет мне иметь тип« Студент »и напрямую конвертироваться в мой объект. Правильно ли я понимаю? –

+0

Но похоже, что AlamofireObjectMapper является односторонним сопоставлением, он не может преобразовать объект в json или я ошибаюсь? –

ответ

1

Я думаю, вы можете добавить трансформируют методы данных JSON в книге и Student структуры, использовать STRUCT вместо класса в Swift. И я пишу какой-то пример кода,

struct Book { 
    var id: Int 
    var name: String 

    static func booksFromJSONArray(jsonArray: [JSON]) -> [Book]? { 
     return jsonArray.flatMap{ jsonItem -> Book in 
      guard let id = jsonItem["id"].int, 
       let name = jsonItem["name"].string 
      else { return nil } 

      return Book(id: id, name: name) 
    } 
} 


struct Student { 
    var name: String 
    var age: Int 
    var books: [Book] 

    func studentFromJSONData(jsonData: JSON) -> Student { 
     let name = jsonData["name"].stringValue 
     let age = jsonData["age"].intValue 
     let books = Book.booksFromJSONArray(jsonData["books"].arrayValue) 

     return Student(name: name, age: age, books: books) 
    } 
} 
+0

Почему бы не использовать класс типа, чтобы сделать то же самое? Я не понимаю. Кроме того, struct - это тип значения, класс - ссылочный тип, поэтому я предпочитаю использовать Class для моих объектов. –

+0

Да, u r справа. Struct - тип значения, переданный скопированным значением, а класс - ссылочный тип, переданный ссылкой. В Swift Apple рекомендует использовать тип значения. Вы можете увидеть WWDC2015session 408: Протокольно-ориентированное программирование в Swift и сеанс 414: создание более совершенных приложений со значениями типов в Swift для получения дополнительной информации. – EricXuan

 Смежные вопросы

  • Нет связанных вопросов^_^