On Sun, 10 Mar 2019 at 17:55, Roelof Wobben <r.wob...@home.nl> wrote:

> I could do something like this :
>
> getImages
>     | json numbers json2  |
>     json := NeoJSONReader
>         fromString:
>             (ZnEasy
>                 get:
>                     '
> https://www.rijksmuseum.nl/api/nl/collection?key=14OGzuak&format=json&type=schilderij&toppieces=True
> ')
>                 contents.
>     numbers := self class fromJSON: json
>     numbers do: [each |  json :=  .........
>                                            imageData = self class ???
>

I'm not sure what "numbers" refers to. It seems a quite non-domain related
identifier.
To understand the domain, pasting the json contents of your link above into
https://jsonformatter.curiousconcept.com/
and collapsing objects I see the structure is...
{
   "elapsedMilliseconds":0,
   "count":4782,
   "countFacets":{
      "hasimage":4359,
      "ondisplay":748
   },
   "artObjects":[ + ] ,
   "facets":[ + ]
}

where artObjects is an array with each art object like this==>
      {
         "links":{
            "self":"https://www.rijksmuseum.nl/api/nl/collection/SK-A-3580";,
            "web":"https://www.rijksmuseum.nl/nl/collectie/SK-A-3580";
         },
         "id":"nl-SK-A-3580",
         "objectNumber":"SK-A-3580",
         "title":"De Singelbrug bij de Paleisstraat in Amsterdam",
         "hasImage":true,
         "principalOrFirstMaker":"George Hendrik Breitner",
         "longTitle":"De Singelbrug bij de Paleisstraat in Amsterdam,
George Hendrik Breitner, 1898",
         "showImage":true,
         "permitDownload":true,
         "webImage":{
            "guid":"cd15e2fa-b1f6-41f4-9e9e-c2ca87abcca3",
            "offsetPercentageX":0,
            "offsetPercentageY":0,
            "width":2880,
            "height":1897,
            "url":"
https://lh3.googleusercontent.com/Bawo7r1nPZV6sJ4OHZJHdKV_4Ky59vquAR7KoUXcNZgx9fqTaOW-QaOM9qoyYhOTAopzjt9OIfW06RMwa-9eJW9KjQw=s0
"
         },
         "headerImage":{
            "guid":"fef39f74-9783-44c9-acae-69eac3a76b01",
            "offsetPercentageX":0,
            "offsetPercentageY":0,
            "width":1920,
            "height":460,
            "url":"
https://lh3.googleusercontent.com/jR6y5a8lFvgYe37WxLPQJZTjBAaBB6aIFYMsFw9gGP1y69TltkVQdWQVoZhSyGN9ZnPKR5taEJPbGhUBSDxlOmNqoyI=s0
"
         },
         "productionPlaces":[
            "Amsterdam"
         ]
      }

So evaluating the following in Playground...
    collectionUrl :=  '
https://www.rijksmuseum.nl/api/nl/collection?key=14OGzuak&format=json&type=schilderij&toppieces=True
'.
    collectionJson := NeoJSONReader fromString: (ZnEasy get: collectionUrl)
contents.
    paintings := Paintings fromJSON: collectionJson.
    paintings inspect.

then cleaning the DNU errors as i went,
starting with your original code (which was good btw)...

    Paintings class >>  fromJSON: json
        | instance artObjects |
        instance := self new.
        artObjects := json at: #artObjects.
        artObjects
            do:
                [ :eachArtObject | instance addPainting: (Painting
fromJSON: eachArtObject) ].
        ^ instance

    Painting class >> fromJSON: json
        | instance |
        instance := self new.
        instance
            title: (json at: #title);
            painter: (json at: #principalOrFirstMaker);
            imageUrl: ((json at: #webImage) at: #url).
        ^ instance

I added (roughly in order that each DNU occurred)...

    Painting >> title: aString
title := aString

    Painting >> painter: aString
painter := aString

    Painting >> imageUrl: aString
imageUrl := aString

    Paintings >> addPainting: aPainting
paintings := paintings ifNil: [ OrderedCollection new ].
paintings add: aPainting.

I get an inspector on a list of paintings and can drill down to a painting
and see each has the expected data,
and just to round things off...

    Painting >> title
^ title

    Painting >> printOn: aStream
super printOn: aStream.
aStream << ' (' << self title << ')'

helps distinguish each item in the Inspector.


Now to extend the Playground code to download and display a painting, in
Playground I evaluated...

    painting := paintings first.
    imageResponse := ZnEasy get: painting imageUrl.
    image := ImageReadWriter formFromStream: imageResponse entity
readStream.
    image inspect.

    Paintings >> first
^ paintings first

    Painting >> imageUrl
^ imageUrl

and an inspector on the `image` variable displays the painting on the Morph
tab.


Now to mold the IDE to your domain...
using Spotter to browser gtInspector* methods, a promising find is...
AbstractFileReference>>gitInspectorJpegIn:
from which I produced...

    Painting  >>  gtInspectorJpegIn: composite
<gtInspectorPresentationOrder: 0>
composite morph
title: 'Painting';
display: [ ImageReadWriter formFromStream: self imageEntity readStream ]

Then inspecting the `paintings` variable and drilling down to a painting
pops up a DNU #imageEntity, which can be resolved by...

    Painting >> imageEntity
^ imageEntity ifNil: [ imageEntity := (ZnEasy get: self imageUrl) entity ].

and you get to see the painting shown in the Inspector.


Now if I understand your question... "Do I need to make some more object to
get this working..."
I'd say... No. You only want one object for each painting. Once you have a
painting object, it should handle all getting all further data it needs for
itself.
You don't want duplicate objects each having half of the data.


can I for example name the function fromJson2 or fromJSONFromLink2  ?
>

By naming convention #fromJson: implies it sits on the class side.
To get further data for an existing object you want an instance-side
method, maybe named #getLink2Json.

HTH,
cheers -ben

Reply via email to