Norbert,

On 25 Sep 2013, at 18:21, Norbert Hartl <norb...@hartl.name> 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

Reply via email to