[squeak-dev] Json dictionary tree accessing
Levente Uzonyi
leves at caesar.elte.hu
Thu Sep 2 10:01:23 UTC 2021
On Thu, 2 Sep 2021, Tobias Pape wrote:
> Hi
>
> I think you can do two tings: Model it out or mock with JsonObject
>
>> On 2. Sep 2021, at 01:33, tim Rowledge <tim at rowledge.org> wrote:
>>
>> When driving JS libraries from Seaside it is often necessary to build a tree of dictionaries to encode settings - for example, using vega-lite to display charts & graphs.
>>
>> I currently have a very simple case that ends up rather verbose -
>> |barchart|
>> barchart := Dictionary new.
>> barchart
>> at: #'$schema' put: 'https://vega.github.io/schema/vega-lite/v5.json';
>> at: #description put: 'A simple bar chart';
>> at: #width put: 'container';
>> at: #usermeta put:
>> (Dictionary new
>> at: #embedOptions put:
>> (Dictionary new
>> at: #export put: true;
>> at: #compiled put: false;
>> at: #editor put: false;
>> yourself);
>> yourself);
>> at: #mark put:
>> (Dictionary new
>> at: #type put: #bar;
>> at: #tooltip put: true;
>> yourself);
>> at: #encoding put:
>> (Dictionary new
>> at: #x
>> put: (Dictionary new
>> at: #field put: 'label';
>> at: #type put: #nominal;
>> at: #axis put:
>> (Dictionary new
>> at: #labelAngle put: -45;
>> yourself);
>> at: #title put: #Group;
>> yourself);
>> at: #y
>> put: (Dictionary new
>> at: #field put: 'value';
>> at: #type put: #quantitative;
>> at: #title put: #Value;
>> yourself);
>> yourself);
>> at: #height put:'container'.
>> ^barchart
>>
>> ... and that's without any actual data!
>
>>
>> If I want to do something like change the label angle I end up with ugliness like
>> (((chartSpec at: #encoding)
>> at: #x)
>> at: #axis)
>> at:#labelAngle put: axisLabellingAngle.
>>
>> I feel sure I've seen this done better but I can't find anything with my current searches. It wouldn't be too hard to implement a method to do #atPath: #(encoding x axis labelAngle) put: thingy but if it's been done cleanly by somebody I'd much rather just load it.
>>
>> Somebody please point me to the ludicrously obvious answer any idiot should have spotted immediately...
>
> Soo, if you mock it like that:
>
> |barchart|
> barchart := JsonObject new.
> barchart
> at: '$schema' put: 'https://vega.github.io/schema/vega-lite/v5.json';
> description: 'A simple bar chart';
> width: 'container';
> usermeta:
> (JsonObject new
> embedOptions:
> (JsonObject new
> export: true;
> compiled: false;
> editor: false;
> yourself);
> yourself);
> mark:
> (JsonObject new
> type: #bar;
> tooltip: true;
> yourself);
> encoding:
> (JsonObject new
> x: (JsonObject new
> field: 'label';
> type: #nominal;
> axis:
> (JsonObject new
> labelAngle: -45;
> yourself);
> title: #Group;
> yourself);
> y: (JsonObject new
> field: 'value';
> type: #quantitative;
> title: #Value;
> yourself);
> yourself);
> height: 'container'.
> ^barchart
Starting from Json-ul.48, you don't need those #yourself sends when
constructing json objects, so you can save those and the barchart variable
as well:
^JsonObject new
at: '$schema' put: 'https://vega.github.io/schema/vega-lite/v5.json';
description: 'A simple bar chart';
width: 'container';
usermeta: (JsonObject new
embedOptions: (JsonObject new
export: true;
compiled: false;
editor: false));
mark: (JsonObject new
type: #bar;
tooltip: true);
encoding: (JsonObject new
x: (JsonObject new
field: 'label';
type: #nominal;
axis: (JsonObject new
labelAngle: -45);
title: #Group);
y: (JsonObject new
field: 'value';
type: #quantitative;
title: #Value));
height: 'container'
Levente
More information about the Squeak-dev
mailing list
|