избежал строки JSON на Swift - PullRequest
0 голосов
/ 24 мая 2019

В приложении для iPhone, использующем SWIFT, мне приходится иметь дело со сторонним API, который отправляет экранированную строку вместо объекта JSON в качестве ответа.

Ответ выглядит так:

"[
{
\"ID\":3880,
\"Name\":\"Exploration And Production Inc.\",
\"ContractNumber\":\"123-123\",
\"Location\":\"Booker #1\",
\"Volume\":1225.75,
\"OtherFees\":10.0
}
]"

До сих пор я имел дело с этим, манипулируя строкой, чтобы удалить ненужные символы, пока я не получил JSON-подобную строку, а затем проанализировал ее как обычно.

Angular имеет удобную функцию для решения этой проблемы:

angular.fromJson(response.data);

У Java есть свой способ справиться с этим. Является ли эквивалентная функция в Swift?

1 Ответ

1 голос
/ 24 мая 2019

Если вы анализируете его в словаре, то самым простым решением будет преобразование String в Data и использование JSONSerialization:

if let data = string.data(using: .utf8) {
    do {
        let responseArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]]
        print(responseArray)
    }
    catch {
        print(error)
    }
}

Но, конечно, было бы лучше обработать егокак модель Codable, в этом случае ее снова так же просто, как:

try JSONDecoder().decode([Item].self, from: data)

При условии, что у вас есть действительная модель Decodable, например:

struct Item: Decodable {
    let id: Int
    let name: String
    //add the other keys you want to use (note its type sensitive)

    enum CodingKeys: String, CodingKey {
         case id = "ID"
         case name = "Name"
    }
}

Наконец, избегайте строковых jsons, потому что это простой источник ошибок.
Неправильные строки или небольшие / большие отклонения в структуре могут легко остаться незамеченными.
Пусть бэкэнд-команда знает, что они должны следовать протоколу в своем API, что еепотребители могут положиться на него.
Устанавливая формат json, он, по сути, похож на контракт, который четко демонстрирует его содержание и цель.
Отправка строкового json просто ленива и плохо отражается на его конструкторе, imho.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...