NeoJSON mapping

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

NeoJSON mapping

NorbertHartl
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
Reply | Threaded
Open this post in threaded view
|

Re: NeoJSON mapping

Sven Van Caekenberghe-2
Norbert,

On 25 Sep 2013, at 18:21, Norbert Hartl <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: NeoJSON mapping

Sven Van Caekenberghe-2
Actually, for the reading part, this variation might be clearer:

(NeoJSONReader on: '{"id":13,"data":"aaa","extent":{"x":250,"y":110}}' readStream)
  for: NeoJSONTestObject2 customDo: [ :mapping |
    mapping reader: [ :jsonReader | | object |
      object := NeoJSONTestObject2 new.
      jsonReader parseMapKeysDo: [ :key |
        key = #id ifTrue: [ object id: jsonReader parseValue ].
        key = #data ifTrue: [ object data: jsonReader parseValue ].
        key = #extent ifTrue: [
          jsonReader parseMapKeysAndValuesDo: [ :key2 :value |
            key2 = #x ifTrue: [ object width: value ].
            key2 = #y ifTrue: [ object height: value ] ] ] ].
      object ] ];
  nextAs: NeoJSONTestObject2

On 27 Sep 2013, at 18:21, Sven Van Caekenberghe <[hidden email]> wrote:

> Norbert,
>
> On 25 Sep 2013, at 18:21, Norbert Hartl <[hidden email]> 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