I would use any of the following: ex := { #track->#pharo. #language->#smalltalk. #exercises->{ #slug->'hello'. #id->55. #topics->#('a' 'b' 'c') } asDictionary } asDictionary. ex := { #track->#pharo. #language->#smalltalk. #exercises->({ #slug->'hello'. #id->55. #topics->#('a' 'b' 'c') } as: NeoJSONObject) } as: NeoJSONObject. ex := NeoJSONObject new track: #pharo; language: #smalltalk; exercises: (NeoJSONObject new slug: 'hello'; id: 55; topics: #('a' 'b' 'c')).
On 1 Mar 2019, at 05:01, Jimmie Houchin <jlhouchin@gmail.com> wrote:
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@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@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