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.