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