Thanks Nathan, it worked.
I didn't know that *LimitOrder.UnmarshalJSON would call json.Unmarshal.

Em terça-feira, 21 de fevereiro de 2017 05:24:45 UTC-3, Nathan Kerr 
escreveu:
>
> I figured it out.
>
> First off, the posted playground had a different json string and did not 
> use your UnmarshalJSON function. These made translating between the 
> non-working setup described in your post and the working playground 
> annoying. In the future, share the non-working setup.
>
> At the point when I figured things out, my code was: 
> https://play.golang.org/p/aMvz_JTrjD. This won't run on playground 
> because it uses github.com/pkg/errors to add context to the errors so I 
> could see which error was returned along with a much needed stack trace.
>
> I found two problems with the implementation of UnmarshalJSON:
>
> 1. tmp["response_data"] and tmp2["order"] return zero values when the key 
> is not found. This happened, first, because of the difference between the 
> posted json and the json in the posted playground. Second, because of the 
> second problem.
>
> 2. json.Unmarshal uses a type's UnmarshalJSON function if it exists to do 
> the unmarshalling. This created a loop where *LimitOrder.UnmarshalJSON 
> calls json.Unmarshal, which calls *LimitOrder.UnmarshalJSON, and so on. 
> Line 71 prints out the call stack for the returned error that confirms this.
>
> My recommended way of doing things is https://play.golang.org/p/kRKevuX8LW, 
> that is write out the structs you need. This will also allow you to check 
> the status_code from the response. If your LimitOrder will outlive the 
> response then change ResponseData.LimitOrder to be a pointer.
>
> Hope this helps.
>
> On Tuesday, February 21, 2017 at 6:25:10 AM UTC+1, Diogo Ribeiro wrote:
>>
>> Could you help me to understand why I'm always getting the error unexpected 
>> end of JSON input while trying to unmarshal the following json to the 
>> LimitOrder struct? It works if I use golang playground 
>> https://play.golang.org/p/udPQ_TayXG but not locally running tests.
>>
>>
>> P.S.: if I use map[string]json.RawMessage instead of LimitOrder struct 
>> I'm able to execute the unmarshal.
>>
>>
>> {
>>   "response_data": {
>>     "order": {
>>       "order_id": 3,
>>       "coin_pair": "BRLBTC",
>>       "order_type": 1,
>>       "status": 4,
>>       "has_fills": true,
>>       "quantity": "1.00000000",
>>       "limit_price": "900.00000",
>>       "executed_quantity": "1.00000000",
>>       "executed_price_avg": "900.00000",
>>       "fee": "0.00300000",
>>       "created_timestamp": "1453835329",
>>       "updated_timestamp": "1453835329",
>>       "operations": [
>>         {
>>           "operation_id": 1,
>>           "quantity": "1.00000000",
>>           "price": "900.00000",
>>           "fee_rate": "0.30",
>>           "executed_timestamp": "1453835329"
>>         }
>>       ]
>>     }
>>   },
>>   "status_code": 100,
>>   "server_unix_timestamp": "1453835329"}
>>
>> *LimitOrder struct*
>>
>>
>> type LimitOrder struct {
>>   OrderId int `json:"order_id"`
>>   CoinPair string `json:"coin_pair"`
>>   OrderType int `json:"order_type"`
>>   Status int `json:"status"`
>>   HasFills bool `json:"has_fills"`
>>   Quantity float64 `json:"quantity,string"`
>>   LimitPrice float64 `json:"limit_price,string"`
>>   ExecutedQuantity float64 `json:"executed_quantity,string"`
>>   ExecutedPriceAvg float64 `json:"executed_price_avg,string"`
>>   Fee float64 `json:"fee,string"`
>>   Operations []*Operation `json:"operations"`
>>   CreatedTimestamp string `json:"created_timestamp"`
>>   UpdatedTimestamp string `json:"updated_timestamp"`}
>>
>>
>> and this is how I'm trying to unmarshal it
>>
>>
>> func (limitOrder *LimitOrder) UnmarshalJSON(buf []byte) error {
>>
>>   tmp := make(map[string]json.RawMessage)
>>   if err := json.Unmarshal(buf, &tmp); err != nil {
>>     return err
>>   }
>>
>>   tmp2 := make(map[string]json.RawMessage)
>>
>>   if err := json.Unmarshal(tmp["response_data"], &tmp2); err != nil {
>>     return err
>>   }
>>
>>   if err := json.Unmarshal(tmp2["order"], limitOrder); err != nil {
>>     return err
>>   }
>>
>>   return nil}
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to