That you very much for your input and a great library. I will use a
variation of the second solution.


On 20 August 2012 15:34, Sven Van Caekenberghe <[email protected]> wrote:

> Hi Milan,
>
> On 20 Aug 2012, at 14:02, Milan Mimica <[email protected]> wrote:
>
> > Hello
> >
> > I have obtained a json from a HTTP response which looks like:
> >
> {"login":{"verified":true,"authCookie":"2eb62b41-5156-4056-9b5d-9252b52c93a2"}}
> >
> > I want to map this into a Smalltalk class LoginResponse which has two
> instance variables: verified and authCookie. So I need the mapper to ignore
> the root property name "login". I think that is a quite common use case.
> How can it be done?
> >
> >
> > --
> > Milan Mimica
> > http://sparklet.sf.net
>
> I understand your question, but currently there is no out of the box
> support for class/type mapping using maps like in your example (there are
> other variation too, like class/type properties, nested or not). The reason
> is that this involves schema checking which I didn't want to do due to the
> added complexity and lack of standardization (this is intentionally outside
> the JSON spec proper).
>
> You have 2 options:
>
> - either use generic parsing and do the conversions and schema checking
> after the parsing (which is what most JSON parser make you do anyway)
>
> NeoJSONReader fromString:
> '{"login":{"verified":true,"authCookie":"2eb62b41-5156-4056-9b5d-9252b52c93a2"}}'.
>
> - write a custom mapping that looks a bit like a hack
>
> (NeoJSONReader on:
> '{"login":{"verified":true,"authCookie":"2eb62b41-5156-4056-9b5d-9252b52c93a2"}}'
> readStream)
>         for: #LoginResponseWrapper customDo: [ :mapping |
>                 mapping reader: [ :jsonReader | | result |
>                         result := nil.
>                         jsonReader parseMapKeysDo: [ :key |
>                                 key = #login
>                                         ifTrue: [ result := jsonReader
> next ] ].
>                         result ] ];
>         nextAs: #LoginResponseWrapper
>
> the above example will go into the login element if it is present and
> return a dictionary.
>
> To make it return your class, this should do the trick
>
> (NeoJSONReader on:
> '{"login":{"verified":true,"authCookie":"2eb62b41-5156-4056-9b5d-9252b52c93a2"}}'
> readStream)
>         mapInstVarsFor: LoginResponse;
>         for: #LoginResponseWrapper customDo: [ :mapping |
>                 mapping reader: [ :jsonReader | | result |
>                         result := nil.
>                         jsonReader parseMapKeysDo: [ :key |
>                                 key = #login
>                                         ifTrue: [ result := jsonReader
> nextAs: LoginResponse ] ].
>                         result ] ];
>         nextAs: #LoginResponseWrapper
>
> I can image a more general purpose LoginResponseWrapper that maps multiple
> types at once.
>
> HTH,
>
> Sven
>
>
>
> --
> Sven Van Caekenberghe
> http://stfx.eu
> Smalltalk is the Red Pill
>
>
>
>
>
>


-- 
Milan Mimica
http://sparklet.sf.net

Reply via email to