Если вам нужно преобразовать его в JSON, как говорится в заголовке вопроса, вы можете использовать протокол Codable
(или typealias для Decodable & Encodable
. Это действительно упрощает преобразование между моделями). и json и обратно.
Вот пример модульного теста для демонстрации обоих способов. Я переключил его на структуру, просто чтобы получить бесплатный init, чтобы сделать его короче, а Equatable
не требуется, только добавлен выполнить сравнение во втором модульном тесте.
import XCTest
struct Drink: Codable, Equatable {
var posId: String?
var name: String?
var description: String?
var tags: [String]?
var unitPrice: String?
}
class CodableDrink: XCTestCase {
func testCreateJSONFromDrink() {
let drink = Drink(posId: "1", name: "Monster", description: "Nasty Energy Drink", tags: ["energy", "caffeine"], unitPrice: "$1.89")
let encoder = JSONEncoder()
let encodedData = try! encoder.encode(drink)
let jsonString = String(data: encodedData, encoding: .utf8)!
XCTAssertEqual(jsonString, """
{"tags":["energy","caffeine"],"unitPrice":"$1.89","name":"Monster","posId":"1","description":"Nasty Energy Drink"}
""")
}
func testCreateDrinkFromJSON() {
let json = """
{"tags":["energy","caffeine"],"unitPrice":"$1.89","name":"Monster","posId":"1","description":"Nasty Energy Drink"}
"""
let decoder = JSONDecoder()
let drink = try! decoder.decode(Drink.self, from: json.data(using: .utf8)!)
XCTAssertEqual(drink, Drink(posId: "1", name: "Monster", description: "Nasty Energy Drink", tags: ["energy", "caffeine"], unitPrice: "$1.89"))
}
}
Эта документация также очень полезна и показывает, как выполнять дополнительные действия, такие как обработка, когда вам нужно имя переменной и ключ в json будет отличаться или как вручную кодировать и декодировать вместо использования автоматического поведения c.