Как разобрать вложенный json? стриж - PullRequest
0 голосов
/ 09 января 2019

У меня есть локальная строка json, и я пытаюсь ее проанализировать, но когда я пытаюсь это сделать, я постоянно получаю сообщение об ошибке. Я также видел эту ошибку во вложенном словаре, но не смог найти ошибку. Ниже строка json

let jsonNestedString  = "{\"meta\":{\"page\":1,\"total_pages\":4,\"per_page\":10,\"total_records\" : 38}, \"reweries\":[\"id\":1234,\"name\":\"saintArnold\"},{\"id\":52892,\"name\":\"buffalo bayou\"]}"

Я делаю этот процесс через Codable, и ниже приведена структура, которую я создал для того же

struct PagedBreweries:Codable{
    struct Meta:Codable{
        let page : Int
        let total_pages:Int
        let per_page:Int
        let total_records: Int
        enum CodingKeys: String, CodingKey{
            case page
            case total_pages
            case per_page
            case total_records
        }
    }

    struct Brewery :Codable{
        let id:Int
        let name:String

    }
    let meta:Meta
    let breweries :[Brewery]
}

затем эти данные анализируются для функции, как показано ниже

    func jsonNested(){
    let jsonData = jsonNestedString.data(using: .utf8)
    let decoder = JSONDecoder()
    let data  = try! decoder.decode(PagedBreweries.Meta.self, from: jsonData!)
    print(data)
}

и когда я пытаюсь собрать, ошибка появляется при попытке! decoder.decode
команда и ошибка

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

Может ли кто-нибудь предложить решение? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 января 2019

JSON поврежден, и вы декодируете неправильный корневой объект.

Это правильный JSON, который декодируется с вашими структурами и соответствует соглашению об именах Swift

let jsonNestedString  = """
{"meta":{"page":1,"total_pages":4,"per_page":10,"total_records" : 38}, "breweries":[{"id":1234,"name":"saintArnold"},{"id":52892,"name":"buffalo bayou"}]}
"""

struct PagedBreweries : Codable {
    struct Meta : Codable {
        let page : Int
        let totalPages:Int
        let perPage:Int
        let totalRecords: Int
    }

    struct Brewery : Codable {
        let id:Int
        let name:String

    }
    let meta:Meta
    let breweries :[Brewery]
}

func jsonNested(){
    let jsonData = Data(jsonNestedString.utf8)
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let data  = try! decoder.decode(PagedBreweries.self, from: jsonData)
    print(data)
}

jsonNested()

// Printed result: 
// PagedBreweries(meta: __lldb_expr_1.PagedBreweries.Meta(page: 1, totalPages: 4, perPage: 10, totalRecords: 38), breweries: [__lldb_expr_1.PagedBreweries.Brewery(id: 1234, name: "saintArnold"), __lldb_expr_1.PagedBreweries.Brewery(id: 52892, name: "buffalo bayou")])
0 голосов
/ 09 января 2019

Правильный JSON

{
    "meta": {
        "page": 1,
        "total_pages": 4,
        "per_page": 10,
        "total_records": 38
    },
    "reweries": [{
    "id": 1234,
    "name": "saintArnold"
    },
    {
    "id": 52892,
    "name": "buffalo bayou"
    }
    ]
}

struct Root: Codable {
    let meta: Meta
    let reweries: [Rewery]
}

struct Meta: Codable {
    let page, totalPages, perPage, totalRecords: Int

    enum CodingKeys: String, CodingKey {  // snake case may be used 
        case age = "page"
        case totalPages = "total_pages"
        case perPage = "per_page"
        case totalRecords = "total_records"
    }
}

struct Rewery: Codable {
    let id: Int
    let name: String
}

  let jsonNestedString  = """
    {\"meta\":{\"page\":1,\"total_pages\":4,\"per_page\":10,\"total_records\":38}, \"reweries\":[{\"id\":1234,\"name\":\"saintArnold\"},{\"id\":52892,\"name\":\"buffalo bayou\"}]}
"""

  // or 

let jsonNestedString  = """

{
    "meta": {
        "page": 1,
        "total_pages": 4,
        "per_page": 10,
        "total_records": 38
    },
    "reweries": [{
    "id": 1234,
    "name": "saintArnold"
    },
    {
    "id": 52892,
    "name": "buffalo bayou"
    }
    ]
}


"""

do {

    let jsonData = jsonNestedString.data(using: .utf8)
    let decoder = JSONDecoder()
    let data  = try decoder.decode(Root.self, from: jsonData!)
    print(data)


} catch  {
    print(error)
}
...