>
>
> > > On 13 Dec 2017, at 05:37, Ben Coman <b...@openinworld.com> wrote:
> > >
> > > Hi Sven (et al),
> > >
> > > On 10 December 2017 at 11:45, Ben Coman <b...@openinworld.com> wrote:
> > >
> > > 3. Finally parse into real objects the nested level holding the data
> you really want...
> > >
> > > Object subclass: #Market
> > >       instanceVariableNames: 'MarketCurrency BaseCurrency
> MarketCurrencyLong BaseCurrencyLong MinTradeSize MarketName IsActive
> Created Notice IsSponsored LogoUrl'
> > >       classVariableNames: ''
> > >       package: 'Bittrex'
> > >
> > > (ZnClient new
> > >       url: 'https://bittrex.com/api/v1.1/public/getmarkets';
> > >       enforceHttpSuccess: true;
> > >       accept: ZnMimeType applicationJson;
> > >       contentReader: [ :entity | |reader|
> > >               reader := (NeoJSONReader on: entity readStream).
> > >               reader for: BittrexResponse do: [:m|
> > >                       m mapInstVar: #success.
> > >                       m mapInstVar: #message.
> > >                       (m mapInstVar: #result) valueSchema:
> #ArrayOfMarkets].
> > >               reader for: #ArrayOfMarkets customDo: [ :mapping |
> mapping listOfElementSchema: Market ].
> > >               reader mapInstVarsFor: Market.
> > >       reader nextAs: BittrexResponse ];
> > >    get) inspect.
> > >
> > > ==>BittrexResponse
> > >       success => true
> > >       message => ''
> > >       result => an Array(a Market(LTC) a Market(DOGE) a Market(VTC) a
> Market(PPC) a Market(FTC) a Market(RDD)
> > > ... Market(POWR) a Market(BTG) a Market(BTG) a Market(BTG) a
> Market(ADA) a Market(ENG) a Market(ENG))
> > >
> > > So the code of [3.] above works fine when the raw response looks like
> this...
> > > (ZnClient new
> > >       url: 'https://bittrex.com/api/v1.1/public/getmarkets';
> > >       get) inspect.
> > > ==> {"success":true,
> > >           "message":"",
> > >           "result": [{"MarketName":"BTC-LTC},{"MarketName":"BTC-NXT}]
> > >         }
> > >
> > > But of course [3.] doesn't work when the raw response looks like
> this...
> > > (ZnClient new
> > >       url: 'https://bittrex.com/api/v1.1/public/getticker?market=BTC-
> LTC';
> > >       get) inspect.
> > > ==> {"success":true,
> > >            "message":"",
> > >            "result":{"Bid":0.01765465,"Ask":0.01769000,"Last":0.
> 01763350}
> > >        }
> > >
> > > since result is a json-object not a json-array.  But I can't work out
> > > how to map the JSON object into the 'result' instance variable of
> BittrexResponse,
> > > where...
> > >
> > > BittrexObject subclass: #BittrexTicker
> > >       instanceVariableNames: 'Bid Ask Last'
> > >       classVariableNames: ''
> > >       package: 'Bittrex'
> > >
> > >
> > > My best guesses so far are uncommenting either [A.] or [B.] below...
> > >
> > > (ZnClient new
> > >       url: 'https://bittrex.com/api/v1.1/public/getticker?market=BTC-
> LTC';
> > >       enforceHttpSuccess: true;
> > >       accept: ZnMimeType applicationJson;
> > >       contentReader: [ :entity | |reader|
> > >               reader := (NeoJSONReader on: entity readStream).
> > >               reader for: BittrexResponse do: [:m|
> > >                       m mapInstVar: #success.
> > >                       m mapInstVar: #message.
> > >                       (m mapInstVar: #result) valueSchema:
> #BittrexTicker].
> > > "A.           reader for: BittrexTicker do: [ :m|
> > >                        m mapInstVar: #Bid]."
> > > "B.           reader for: #BittrexTicker customDo: [ :mapping |
> > >                       mapping mapWithValueSchema: BittrexTicker]."
> > >       reader nextAs: BittrexResponse ];
> > >    get).
> > >
> > >
> > > Can you advise what formulation is required?
>
>

> On 13 December 2017 at 15:33, Sven Van Caekenberghe <s...@stfx.eu> wrote:
>
>>
>>
>> > On 13 Dec 2017, at 07:49, Ben Coman <b...@openinworld.com> wrote:
>> >
>> >
>> >
>> > On 13 December 2017 at 14:40, Sven Van Caekenberghe <s...@stfx.eu>
>> wrote:
>> > Yeah, that is the main problem with JSON. It cannot capture that
>> variability in its own spec. Sure, there are tons of extensions on top of
>> JSON to address these aspects, but NeoJSON only deals with the raw spec.
>> And any server can use its own version.
>> >
>> > Simple answer is indeed: getmarkets and getticker return different
>> schema, since you know what you call, you can map accordingly. (And hope
>> the server does not do further variability). There cannot be one global
>> mapping.
>> >
>> >
>> > Thats cool.  I'm not looking for one global mapping to simultaneously
>> handle getmarkets and getticker together.
>> > I'm just looking to handle getticker in isolation.  I can't work that
>> part out.
>>
>> Hmm, your result ivar in response is of type ticker which maps its 3
>> ivars. So uncomment A but add all 3 ivars to ticker. no ?
>
>
Thats what I gathered from the test examples (and [B.] was really grasping
at straws.)
I just assumed my understanding was lacking.

Attacking it with renewed confidence from your response,
tracing through I found the problem was the line before [A.] should have
been....
    (m mapInstVar: #result) valueSchema: BittrexTicker].
 not
    (m mapInstVar: #result) valueSchema: #BittrexTicker].

now it works.
thanks for your assistance.
cheers -ben

Reply via email to