Create a struct for Metadata and conform to Coding Code:
let string = """ { "id": "4yq6txdpfadhbaqnwp3", "email": "john....@example.com", "name":"John Doe", "metadata": { "link_id": "linked-id", "buy_count": 4 } } """ let data = string.data(using: .utf8)! //Force unwrapping just for ease of explanation, use guard instead struct User: Codable { //Struct to handle the nested JSON struct Metadata : Codable { var linkID : String var buyCount : Int //Customisation, if you want if you want your properties to be different from the JSON key private enum CodingKeys : String, CodingKey { case linkID = "link_id" case buyCount = "buy_count" } } var id: String var email : String var name : String var metadata : Metadata } let decoder = JSONDecoder() do { let user = try decoder.decode(User.self, from: data) print(user) } catch { print("error:\(error)") } Reference: https://developer.apple.com/videos/play/wwdc2017/212/ <https://developer.apple.com/videos/play/wwdc2017/212/> Regards, Muthu > On 19 Jun 2017, at 3:29 AM, Jon Shier via swift-users <swift-users@swift.org> > wrote: > > The more I use Codable, the less suited to networking it becomes. In > reading a variety of blog posts about implementing custom Decodable support > from JSON, I kept running across the same pattern. Basically, users had > started implementing their own decoding protocols which wrap Decodable types, > and have a type that represents the JSON representation and then their real > type, with an initializer connecting the two. But apparently this is Apple’s > official solution, which is rather terrible since it would be completely > unnecessary if the Decodable APIs were more flexible or we could access keys > by key path rather than nesting full containers. I can’t image how much code > I would have to add to decode the nasty JSON APIs I’ve used Argo to parse > before. Every type would need an underlying raw representation that, at the > very least, would need custom keys, lest I pollute even those models with the > terrible keys the JSON actually has. Not to mention the various transforms I > needed. Once I hit any reasonably complex API, Argo is far far simpler to > implement in fewer lines of code. > In trying to make Argo’s JSON enum Decodable itself, I can’t seem to > find a way to access the Any representation of the raw JSON. In fact, it > appears there’s no way to represent an Any value in Codable at all, which > makes Codable rather useless for the scenarios like the one that prompted > this thread. Without such an ability it’s impossible to actually use Codable > with all of the JSON out there, where other solutions work just fine. Argo’s > JSON type is decodable by Argo, so you can use it to represent a blob of JSON > just fine. Other existing JSON frameworks have similar solutions. > > > > Jon > >> On Jun 18, 2017, at 3:21 AM, Rien via swift-users <swift-users@swift.org> >> wrote: >> >> Dang, hit send too soon. Sorry. >> >> This does not address your question, so please ignore… (foot in mouth)! >> >> Regards, >> Rien >> >> Site: http://balancingrock.nl >> Blog: http://swiftrien.blogspot.com >> Github: http://github.com/Balancingrock >> Project: http://swiftfire.nl - An HTTP(S) web server framework in Swift >> >> >> >> >> >> >> >>> On 18 Jun 2017, at 09:19, Rien <r...@balancingrock.nl> wrote: >>> >>> Are you looking for a general purpose JSON interpreter / API ? >>> >>> There are many of them around, and in fact I do have my own: >>> https://github.com/Balancingrock/VJson >>> >>> With VJson I would write: >>> >>> let json = VJson.parse(… your json object…) >>> >>> and then access the metadata as: >>> >>> let buyCount = (json | ”metadata” | ”buy_count”)?.intValue >>> >>> or: >>> >>> var buyCount: Int &= json | “metadata” | “buy_count” >>> >>> To loop over the content of metadata: >>> >>> for item in (json | “metadata”) ?? [ ] { >>> print (item.nameValue) >>> switch item.type { >>> case .object: … >>> case .number: … >>> case .string: … >>> etc... >>> } >>> } >>> >>> Obviously I am plugging my own code here, but there are many others around, >>> I understand that SwiftyJSON is quite popular but I have not used that >>> myself. >>> >>> Regards, >>> Rien >>> >>> Site: http://balancingrock.nl >>> Blog: http://swiftrien.blogspot.com >>> Github: http://github.com/Balancingrock >>> Project: http://swiftfire.nl - An HTTP(S) web server framework in Swift >>> >>> >>> >>> >>> >>> >>> >>>> On 18 Jun 2017, at 04:07, Chris Anderson via swift-users >>>> <swift-users@swift.org> wrote: >>>> >>>> Say I have a JSON object such as: >>>> >>>> { >>>> "id": "4yq6txdpfadhbaqnwp3", >>>> "email": "john....@example.com", >>>> "name":"John Doe", >>>> "metadata": { >>>> "link_id": "linked-id", >>>> "buy_count": 4 >>>> } >>>> } >>>> >>>> And with a struct of: >>>> >>>> struct User: Codable { >>>> var id: String >>>> var email: String >>>> var name: String >>>> } >>>> >>>> How can I decode the `metadata` field into a Dictionary? >>>> >>>> I’ve tried doing things such as, in my struct, >>>> >>>> var metadata: Dictionary >>>> >>>> or >>>> >>>> var metadata: [String: Any] >>>> >>>> But I get the error >>>> >>>> MyPlayground.playground:3:7: note: cannot automatically synthesize >>>> 'Encodable' because '<<error type>>' does not conform to 'Encodable' >>>> var metadata: Dictionary >>>> >>>> A meta or metadata field on many APIs (such as www.stripe.com) can contain >>>> whatever you want, and I still want to be able to process it on the Swift >>>> end. How can I store that meta data field into a Dictionary that I can >>>> parse apart manually after? >>>> >>>> Thanks! >>>> >>>> Chris Anderson >>>> >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> swift-users mailing list >>>> swift-users@swift.org >>>> https://lists.swift.org/mailman/listinfo/swift-users >>> >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org >> https://lists.swift.org/mailman/listinfo/swift-users > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users