Hello Sven,��

Thanks for that hint! It looks like exactly what I need ������

Best regards,��
Marc

Am 24.05.2017 16:38 schrieb "Sven Van Caekenberghe" <sven@stfx.eu>:
Marc,

> On 24 May 2017, at 16:20, Marc Hanisch via Pharo-users <pharo-users@lists.pharo.org> wrote:

> Hello,
>
> is there a way to query a JSON with a path (JSONPath or some custom format)?
>
> I want to query an API and collect the JSON responses, which I need to iterate over to extract some data. Modelling the JSON structure as classes would be too much overhead, I think. I just want to collect some values...
>
> Thanks in advance,
> Marc

Normally, when you use the NeoJSON package and you don't do any mapping, you get Dictionaries and Arrays back.

There is however also something called NeoJSONObject, a Dictionary subclass that has some API that is quite fluent and that does include path style access.

To get started, use NeoJSONObject class>>#fromString: as parser.

Here is the class comment:

===
I am NeoJSONObject.
I am a Dictionary.

I behave more like a JavaScript object. I return nil for missing keys. I allow any property to be read or set by using a normal accessor message.

The following are equivalent:

�� �� �� �� self foo.
�� �� �� �� self at: #foo.

As are the following

�� �� �� �� self foo: 1.
�� �� �� �� self at: #foo put: 1.

Except that in the first case, self is returned.

I can optionally be used by NeoJSONReader as mapClass (see #mapClass:).

For output, I act just like my superclass (it is thus not necessary to do any conversions).

Example:

�� �� �� �� NeoJSONObject fromString: '{"foo":1,"bar":-2}'.
�� �� �� �� NeoJSONObject new foo: 1; bar: -2.
�� �� �� �� { #x -> 100. #y -> 200 } as: NeoJSONObject.
�� �� �� �� (NeoJSONObject new data: (NeoJSONObject new id: #sensor1; value: 37.5)) asString.

I use JSON as my printed representation. To convert me to JSON, use #printString or #asString.

Additionally, I support path access for nested instances of me, using #atPath: and #atPath:put:

The first is special because it returns nil as soon as a key is missing. The second is special because it creates extra levels (instances of me) as needed to follow the path of keys.

�� �� �� �� NeoJSONObject new atPath: #(one two three) put: 42; yourself.
�� �� �� �� NeoJSONObject new atPath: #(one two three) put: 42; atPath: #(one two three).
===

HTH,

Sven