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