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

Jimmie Houchin jlhouchin at gmail.com
Thu Feb 28 23:01:32 EST 2019


I don't know if you really need OrderedDictionary or not. But I am a big 
fan of and use all the time simple Arrays or OrderedCollection of pairs. 
It is neat, clean and readable.

ex := Dictionary newFromPairs: {
     'track'. 'pharo.
     'language'. 'smalltalk'.
     'exercises'. Dictionary newFromPairs: {
         'slug'. 'hello'.
         'id'. 55.
         'topics'. #('a' 'b' 'c')}

In my app each individual level creates its own Dictionaries.

I don't if such would be applicable for you.

I have methods at each level which start like below. I don't know ahead 
of time whether or not I am receiving a Dictionary or an Array. I use 
this extensively for configuration that is readable and compact. I 
prefer this to the above when possible. And prefer pairs to 
associations. To my eyes it is cleaner.

config := {
     'track'. 'pharo.
     'language'. 'smalltalk'.
     'exercises'. {
         'slug'. 'hello'.
         'id'. 55.
         'topics'. #('a' 'b' 'c')}

myMethod: config
     confd := config isDictionary
         ifTrue: [ config ]
         ifFalse: [ Dictionary newFromPairs: config ].
         ...

I use this also for JSON as I am using a REST API which receives JSON 
objects but it is also easy to pass in the necessary key:value pairs to 
the ZnClient.

I don't know if this is of any value. But it is something I do 
extensively and pervasively in my app. I spent a lot of time thinking 
and iterating on how to handle large, complex, and nested configurations 
and enable them to be as clean, neat and concise as possible without 
limiting them in any foreseeable manner.

Jimmie



On 2/28/19 7:45 AM, 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 at 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 <sven at 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 at 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
>>>
>>
>



More information about the Pharo-users mailing list