As I merrily chat to myself - I noticed that STONWriter almost does what I need 
- it just complains in #writeAssociation: so I make a subclass STONJSONWriter 
and override:

writeAssociation: association
        “don’t smack me….
        jsonMode
                ifTrue: [ self error: 'wrong object class for JSON mode' ]."
        self 
                encodeKey: association key 
                value: association value

I get exactly what I would expect - valid Json from simple Collections, 
Associations and Array.

So would it be handy to have such a writer in the image (or let STONWriter be 
more configurable for this?)

Tim

p.s. my finally example would then be:

ex := { 'track'-> 'pharo'. 
        'language' -> 'smalltalk'.
         'exercises' ->
                {'slug' -> 'hello'.
                'id' -> 55.
                'topics' -> #('a' 'b' 'c') }
                }.
        
String streamContents: [ :stream |
        (STONJSONWriter on: (stream)) 
                jsonMode: true; 
                prettyPrint: true;      
                writeList: ex ].

> On 28 Feb 2019, at 13:45, Tim Mackinnon <tim@testit.works> wrote:
> 
> Just to add more flavour to this - it seems quite wordy that we have to do 
> this (or equivalent) to write some config. 
> 
> ex := OrderedDictionary new 
>       at: 'track' put: 'pharo';
>       at: 'language' put: 'smalltalk';
>       at: 'exercises' put: (
>               OrderedDictionary new
>                       at: 'slug' put: 'hello';
>                       at: 'id' put: 55;
>                       at: 'topics' put: #('a' 'b' 'c');
>                       yourself );
>       yourself.
>               
> String streamContents: [ :stream |
>       (NeoJSONWriter on: (stream)) prettyPrint: true;
>       mapInstVarsFor: Association;
>       nextPut: ex ].
> 
> So I’m still wondering the NeoJSONObjectMapping can do something easy for 
> Association other than simply mapInstVars?
> 
> 
>> On 28 Feb 2019, at 13:36, Tim Mackinnon <tim@testit.works> wrote:
>> 
>> Hi Sven - is there no convenience shortcut we can use in our code to make 
>> this less wordy when we are specifying it?
>> 
>> E.g. the following is very convenient to write - but doesn’t work (as you 
>> have $‘ and not $“ )
>> 
>> ex := { 'track'-> 'pharo'. 
>>      'language' -> 'smalltalk'.
>>       'exercises' ->
>>              {'slug' -> 'hello'.
>>              'id' -> 55.
>>              'topics' -> #('a' 'b' 'c') }
>>              }.
>>              
>> String streamContents: [ :stream |
>>      (STONWriter on: (stream)) prettyPrint: true;    writeList: ex ].
>> 
>> I had thought maybe NeoJSON might help and put:
>> 
>> String streamContents: [ :stream |
>>      (NeoJSONWriter on: (stream)) prettyPrint: true;
>>      "mapInstVarsFor: Association;"
>>      nextPut: ex ].
>> 
>> But I get the error about missing an association mapping. If I uncomment 
>> that bit - I get things like: { "value" : “pharo" },
>> 
>> So is there a way I can write a simple mapper for Association that will 
>> write out the key in a string and the value in a string?
>> 
>> I’m quite suprised we can’t easily write out fragments of Json in our code 
>> in a light weight way? Or do I need to make a proper Config object and then 
>> teach it how to map properly such that rather than fiddling with our { x->y 
>> } dictionary sugar I do something like:
>> 
>> Config new at: ‘id’ is: 123; at: ‘name’ is: ‘Tim’; at: ‘exercises’ is: #(1 2 
>> 3).
>> 
>> And I guess at:is: can do the Association asDictionary thing?
>> 
>> But I thought Neo might give me something like that, as it must be terribly 
>> common?
>> 
>> Tim
>> 
>>> On 28 Feb 2019, at 13:16, Sven Van Caekenberghe <s...@stfx.eu> wrote:
>>> 
>>> STONJSON toString: { #id->1. #name->'tim' } asDictionary.
>>> 
>>> JSON cannot deal with Associations by themselves.
>>> 
>>>> On 28 Feb 2019, at 14:05, Tim Mackinnon <tim@testit.works> wrote:
>>>> 
>>>> I am stumped about how to write out some simple json (for a config file). 
>>>> I didn't think I need Neo, and STONJSON would be fine but it seems like 
>>>> creating items like: 
>>>> 
>>>> { 'id'-> self id. 'name' -> self name }
>>>> 
>>>> gives an error about the association. I think you have to do: { ('id'-> 
>>>> self id) asDictionary. ('name' -> self name) asDictionary } everywhere….
>>>> 
>>>> But when I switch over to NeoJsonWriter it also complains about 
>>>> Assocations too. I just want a simple output like:
>>>> { "id" : 12, "name" : "tim” }
>>>> 
>>>> I thought it was simple to do this? Am I missing something obvious.
>>>> 
>>>> Tim
>>> 
>>> 
>> 
>> 
> 
> 


Reply via email to