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