Norbert,
On 25 Sep 2013, at 18:21, Norbert Hartl <[email protected]> wrote:
> Is it possible to make a mapping for NeoJSON that an object shape maps to a
> different shape. I mean if it is possible to have a class with instVars:
>
> Foo
> +name
> +x
> +y
>
> that maps to
>
> {
> 'name' ; …,
> 'point' : {
> x : …,
> y : …. }
> }
>
> thanks,
>
> Norbert
With custom mappings you can do pretty much what you want.
Here is one way it can be done:
String streamContents: [ :out |
(NeoJSONWriter on: out)
mapAllInstVarsFor: Point;
for: NeoJSONTestObject2 customDo: [ :mapping |
mapping writer: [ :jsonWriter :object |
jsonWriter writeMapStreamingDo: [ :jsonMapWriter |
jsonMapWriter
writeKey: #id value: object id;
writeKey: #data value: object data;
writeKey: #extent value: object width @ object height ] ] ];
nextPut: NeoJSONTestObject2 example1 ].
(NeoJSONReader on: '{"id":13,"data":"aaa","extent":{"x":250,"y":110}}'
readStream)
for: NeoJSONTestObject2 customDo: [ :mapping |
mapping reader: [ :jsonReader | | object |
object := NeoJSONTestObject2 new.
jsonReader parseMapKeysAndValuesDo: [ :key :value |
key = #id ifTrue: [ object id: value ].
key = #data ifTrue: [ object data: value ].
key = #extent ifTrue: [ object width: (value at: #x); height: (value
at: #y) ] ].
object ] ];
nextAs: NeoJSONTestObject2.
Regards,
Sven