Comments (3)
i'd handle this nesting in one of two ways. either create nested Gloss models for each step - or, use guard
statements within the initializer to assure the JSON has the desired values.
the two examples you provided are similar, so i'm only going to illustrate one unless there's a particular need.
Strategy 1 - Everything is a model:
struct MyObject: Decodable {
let data: Data
init?(json: JSON) {
guard let data: Data = "data" <~~ json
else { return nil }
self.data = data
}
}
struct Data: Decodable {
let user: User
init?(json: JSON) {
guard let user: User = "user" <~~ json
else { return nil }
self.user = user
}
}
struct User: Decodable {
let id: Int
let name: String
init?(json: JSON) {
guard let id: Int = "id" <~~ json,
let name: String = "name" <~~ json
else { return nil }
self.id = id
self.name = name
}
}
Here, we see the object that represents the full JSON, MyObject
, has a property that is another Gloss model, Data
, which has a property that is another Gloss model, User
.
Strategy 2 - Use guard
statements to drill down to the model you want
struct MyObject2: Decodable {
let user: User
init?(json: JSON) {
guard let dataJSON = json["data"] as? JSON, user: User = "user" <~~ dataJSON
else {
return nil
}
self.user = user
}
}
Here, the desired property was a User
model instead of a Data
model, so we guaranteed with our guard
statement that the nested JSON under the "data"
key was present before constructing our property out of it.
Hope that helps.
from gloss.
Hey thanks mate!, this really put it clear to me.
Btw I came here because I read your blog http://harlankellaway.com/blog/2015/07/05/swift-json-parsing-by-example/
I ended using your solution since it seems less complicated and allows me to deal with object construction within the init?(json: JSON) which is great but it seems that the only benefit here is the use of the operator <~~ otherwise we would end just crating an object as a normal init in your model.
I was trying to implement ObjectMapper before, I must say it has really good features like nested values using dot notation, the func value(), valuerOrFail(), valueOf(default) are really awesome tools but unfortunately it doesn't work well on real world scenarios where JSON are big, diverse and more complicated that the usual "samples"
Thanks again great work 👍
from gloss.
thanks for reading the post and trying it out 👌🏼
yes, a benefit comes in taking away a lot of boilerplate you'd have to write in translating all sorts of values - numbers, strings, enums, arrays, other models - from JSON yourself and allows you to focus on an almost one to one matching of property to JSON key
from gloss.
Related Issues (20)
- toJSON() HOT 1
- Ambiguous operator error
- Change to change log? HOT 2
- Operators from unordered precedence groups HOT 1
- Decode json itself HOT 3
- swift package generate-xcodeproj fails HOT 4
- Carthage update fails for macOS (umbrella header 'Gloss.h' not found). Shouldn't Glass MacOS target membership be "public"? HOT 4
- Deprecated method warning in Gloss 2.0.1 HOT 1
- Can't decode 'anonymous' values HOT 3
- Cannot convert value of type 'JSON' to expected argument type 'JSON' (aka Dictionary<String, Any>') HOT 1
- Crash on device, but not on simulator
- Unexpected E0F while looking for matching HOT 3
- Value found for key "exclude_list" but decoding failed HOT 1
- Initializer 'init()' is internal and cannot be referenced from a default argument value HOT 1
- BaseResponse with Arrays and Generics HOT 1
- Update to use Swift 4.2 HOT 3
- using guard while decoding object = Value found for key "topStory" but decoding failed. HOT 3
- swift5 HOT 8
- WatchOS target should be Swift 4 HOT 6
- How to parse json that contains only array HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gloss.