[Pharo-users] How to write out simple Json?

Henrik Sperre Johansen henrik.s.johansen at veloxit.no
Thu Feb 28 11:07:40 EST 2019


Tim Mackinnon 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@

> > 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 <

> sven@

> > 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@

> > 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
>>> 
>>> 
>> 
>>

The middle ground I've landed on is having a MySettings object,
so I can write
MySettings 
   track: 'pharo';
   language: 'smalltalk';
   exercises: 
      {'slug' -> 'hello'.
       'id' -> 55.
       topics -> #('a' 'b' 'c')}

and have the accessors for dictionaries convert them to such from arrays of
associations.
It's a bit more scaffolding, but is (imho) nicer to use elsewhere in the
system (compared to a pure Dictionary).

But then again, I haven't had a need for dictionaries in dictionaries so
far...

Cheers,
Henry






--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html



More information about the Pharo-users mailing list