Строка быстрого декодирования JSON не работает

struct APOD: Codable {
    let points: String
    let full_name: String
    let description: String
}

let decoder = JSONDecoder()
let product = try! decoder.decode(APOD.self, from: jsonData.data(using: .utf8)!)

print(product.full_name)

У меня есть строка с именем jsonData, которая поступает из: https://www.instagram.com/georgeanisimow/?__a=1. Я отформатировал файл и вставил его в проект, чтобы что-то поработало.

К сожалению, это не удается с этим кодом ошибки:

"Тема 1: Неустранимая ошибка:" попробуйте! " выражение неожиданно вызвало ошибку: Swift.DecodingError.keyNotFound (CodingKeys (stringValue: "points", intValue: nil), Swift.DecodingError.Context (codingPath: [], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" точки \ ", intValue: nil) (\" points \ ").", lowerError: nil)) "

Я пытаюсь напечатать значение для "full_name" в JSON.

Вот начало JSON:

let jsonData ="""    
{  
   "logging_page_id":"profilePage_592027119",
   "show_suggested_profiles":false,
   "graphql":{  
      "user":{  
         "biography":"- Represented by AEFH Talent and CESD Modeling - I travel a lot -",
         "blocked_by_viewer":false,
         "country_block":false,
         "external_url":null,
         "external_url_linkshimmed":null,
         "edge_followed_by":{  
            "count":4571
         },
         "followed_by_viewer":true,
         "edge_follow":{  
            "count":741
         },
         "follows_viewer":true,
         "full_name":"George Anisimow"
      }
   }
}"""

person Peter Shaburov    schedule 05.01.2019    source источник
comment
Ошибка довольно очевидна: в корневом объекте JSON нет ключа points. Ссылка ничего не показывает.   -  person vadian    schedule 05.01.2019
comment
@vadian Извините, я этого не понял. В любом случае, у меня JSON вставлен в проект, без получения данных.   -  person Peter Shaburov    schedule 05.01.2019
comment
Отредактируйте вопрос и добавьте (начало) JSON.   -  person vadian    schedule 05.01.2019
comment
@vadian Сделал это только что   -  person Peter Shaburov    schedule 05.01.2019
comment
Включите points, full_name, description ключи в JSON, который вы добавили в вопрос.   -  person hardik parmar    schedule 05.01.2019


Ответы (2)


Вы получите full_name с этими структурами (я указал только соответствующие ключи)

struct Root: Decodable {
    let graphql : Graphql
}

struct Graphql: Decodable {
    let user : User
}

struct User: Decodable {
    let fullName : String
}

и расшифровать данные

let data = Data(jsonData.utf8)
do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let result = try decoder.decode(Root.self, from: data)
    let fullname = result.graphql.user.fullName
    print(fullname)

} catch { print(error) }
person vadian    schedule 05.01.2019

Есть много способов сделать это

Первый метод:

do {
    let responseData = Data(data.utf8)
    let decodeData = try JSONDecoder().decode(Controller.self, from: responseData)

    if (decodeData.ErrorCode! == "0") {
        //Success
    } else {
        //Failure
    }
} catch let jsonErr {
    //Failure
}

Второй метод:

do {
    if let responseData = response.data, let decodedData = try JSONSerialization.jsonObject(with: responseData, options: []) as? [[String: Any]] {
     print(decodedData)
    }
} catch let error as NSError {
    print(error)
}
person VIJAY SINGH RAGHAV    schedule 05.01.2019