Create a struct for Metadata and conform to Coding
Code:
let string = """
{
"id": "4yq6txdpfadhbaqnwp3",
"email": "[email protected]",
"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 <[email protected]>
> 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 <[email protected]>
>> 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 <[email protected]> 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
>>>> <[email protected]> wrote:
>>>>
>>>> Say I have a JSON object such as:
>>>>
>>>> {
>>>> "id": "4yq6txdpfadhbaqnwp3",
>>>> "email": "[email protected]",
>>>> "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
>>>> [email protected]
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>
>> _______________________________________________
>> swift-users mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-users
>
> _______________________________________________
> swift-users mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users