简体   繁体   English

如何解析嵌套的json? 迅速

[英]How to parse nested json? Swift

i have a local json string and i am trying to parse it but when i try to do so, i am constantly getting an error.我有一个本地 json 字符串,我正在尝试解析它,但是当我尝试这样做时,我不断收到错误消息。 I have also seen this error in nested dictionary but couldnt find an error.我也在嵌套字典中看到了这个错误,但找不到错误。 Below is the json string下面是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\"]}"

i am doing this process via Codable and below is the struct i have created for the same我正在通过 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]
}

then this data is parsed to a function as below然后将此数据解析为如下函数

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

and when i try to build, the error i get is present in try!当我尝试构建时,我得到的错误出现在尝试中! decoder.decode解码器.解码
command and the error is命令,错误是

Thread 1: Fatal error: 'try!'线程 1:致命错误:“尝试!” expression unexpectedly raised an error: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "page", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \\"page\\", intValue: nil) (\\"page\\").", underlyingError: nil))表达式意外引发错误:Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "page", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \\") page\\", intValue: nil) (\\"page\\").",underlyingError: nil))

Could any one provide a solution?任何人都可以提供解决方案吗? Thanks in advance提前致谢

Correct json正确的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)
}

The JSON is corrupt and you are decoding the wrong root object. JSON 已损坏,您正在解码错误的根对象。

This is the correct JSON being decoded with your structs and conforming to the Swift naming convention这是使用您的结构解码并符合 Swift 命名约定的正确JSON

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")])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM