Given that, per his description, “metadata” can be anything, creating a struct 
doesn’t really help.



Jon Shier

> On Jun 18, 2017, at 9:00 PM, somu subscribe <somu.subscr...@gmail.com> wrote:
> 
> Create a struct for Metadata and conform to Coding
> 
> Code:
> 
> let string = """
> {
>   "id": "4yq6txdpfadhbaqnwp3",
>   "email": "john....@example.com <mailto: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 
>> <mailto: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 
>>> <mailto: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 <http://balancingrock.nl/>
>>> Blog: http://swiftrien.blogspot.com <http://swiftrien.blogspot.com/>
>>> Github: http://github.com/Balancingrock <http://github.com/Balancingrock>
>>> Project: http://swiftfire.nl <http://swiftfire.nl/> - An HTTP(S) web server 
>>> framework in Swift
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>>> On 18 Jun 2017, at 09:19, Rien <r...@balancingrock.nl 
>>>> <mailto: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 
>>>> <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 <http://balancingrock.nl/>
>>>> Blog: http://swiftrien.blogspot.com <http://swiftrien.blogspot.com/>
>>>> Github: http://github.com/Balancingrock <http://github.com/Balancingrock>
>>>> Project: http://swiftfire.nl <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 <mailto:swift-users@swift.org>> wrote:
>>>>> 
>>>>> Say I have a JSON object such as:
>>>>> 
>>>>> {
>>>>>  "id": "4yq6txdpfadhbaqnwp3",
>>>>>  "email": "john....@example.com <mailto: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 
>>>>> <http://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 <mailto:swift-users@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>> 
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto: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

Reply via email to