Преобразование проблемной строки JSON в объекты в Swift - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть строка, которую я не могу преобразовать в JSON.Я пробовал JSONDecode, JSONSerialization и все остальное, что предлагалось на первых нескольких страницах поиска.Я также попытался расшифровать его в кодируемые структуры.

Я подумал, что может быть проблема с тем фактом, что данные содержат символы новой строки ("\ r \ n"), поэтому я также попытался удалить их, а также удалить пробел (есть много,Я хотел сделать что-нибудь противное и не для печати там не было).Строка здесь, она очень длинная.

var rawData: String = "{\r\n    \"contacts\": [\r\n        {\r\n                \"id\": \"c200\",\r\n                \"name\": \"Ravi Tamada\",\r\n                \"email\": \"ravi@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c201\",\r\n                \"name\": \"Johnny Depp\",\r\n                \"email\": \"johnny_depp@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c202\",\r\n                \"name\": \"Leonardo Dicaprio\",\r\n                \"email\": \"leonardo_dicaprio@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c203\",\r\n                \"name\": \"John Wayne\",\r\n                \"email\": \"john_wayne@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c204\",\r\n                \"name\": \"Angelina Jolie\",\r\n                \"email\": \"angelina_jolie@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"female\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c205\",\r\n                \"name\": \"Dido\",\r\n                \"email\": \"dido@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"female\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c206\",\r\n                \"name\": \"Adele\",\r\n                \"email\": \"adele@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"female\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c207\",\r\n                \"name\": \"Hugh Jackman\",\r\n                \"email\": \"hugh_jackman@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c208\",\r\n                \"name\": \"Will Smith\",\r\n                \"email\": \"will_smith@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c209\",\r\n                \"name\": \"Clint Eastwood\",\r\n                \"email\": \"clint_eastwood@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c2010\",\r\n                \"name\": \"Barack Obama\",\r\n                \"email\": \"barack_obama@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c2011\",\r\n                \"name\": \"Kate Winslet\",\r\n                \"email\": \"kate_winslet@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"female\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        },\r\n        {\r\n                \"id\": \"c2012\",\r\n                \"name\": \"Eminem\",\r\n                \"email\": \"eminem@gmail.com\",\r\n                \"address\": \"xx-xx-xxxx,x - street, x - country\",\r\n                \"gender\" : \"male\",\r\n                \"phone\": {\r\n                    \"mobile\": \"+91 0000000000\",\r\n                    \"home\": \"00 000000\",\r\n                    \"office\": \"00 000000\"\r\n                }\r\n        }\r\n    ]\r\n}"

Строка - это просто демонстрационные данные из здесь

Любые идеи, мысли или рабочие образцы были бы хорошими,Я знаю, что это распространенный вопрос, но попробовав почти все, я все еще не могу заставить его работать.

1 Ответ

0 голосов
/ 12 сентября 2018

JSONDecoder не заботится о пробелах или символах новой строки, если это правильно сформированный JSON. Подумайте о том, какой должна быть ваша модель, а не о новых символах строки.

Из краткого обзора JSON я создал следующие структурные модели:

struct Phone : Codable {
    let mobile: String
    let home: String
    let office: String
}

struct Contact : Codable {
    let id: String
    let name: String
    let email: String
    let address: String
    let gender: String
    let phone: Phone
}

struct Contacts : Codable {
    let contacts: [Contact]
}

И вам просто нужно декодировать Contacts объект следующим образом:

let json = try! Data.init(contentsOf: URL(string: "https://api.androidhive.info/contacts/")!)
let decoder = JSONDecoder()
let contacts = try! decoder.decode(Contacts.self, from: json)

Одной из возможных причин, по которой вы не можете декодировать, может быть то, что вы допустили ошибку, когда скопировали строку JSON и сделали ее одной строкой. Как вы можете видеть здесь, я использовал Data.init(contentsOf:) для получения данных. Это гораздо надежнее, чем копировать и вставлять строку самостоятельно.

Также обратите внимание, что в Swift есть многострочные строковые литералы:

let jsonString = """
your multiline JSON can go here...
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...