2016-11-16 10 views
0

私はこのようになりますJSONデータがあります。GolangのキーレスJSON配列をアンマーシャリングする方法は?

type TradeHistoryResponse []TradeHistoryInfo 

type TradeHistoryInfo struct { 
    GlobalTradeID int64 `json:"globalTradeID"` 
    TradeID   int64 `json:"tradeID"` 
    Date   string `json:"date"` 
    Type   string `json:"type"` 
    Rate   float64 `json:"rate,string"` 
    Amount   float64 `json:"amount,string"` 
    Total   float64 `json:"total,string"` 
} 

そしてようにJSONデータを引っ張っ::私はタイプを定義することによって、このJSONをアンマーシャリングしようとした

[ 
    { 
    "globalTradeID": 64201000, 
    "tradeID": 549285, 
    "date": "2016-11-11 23:51:58", 
    "type": "buy", 
    "rate": "10.33999779", 
    "amount": "0.02176472", 
    "total": "0.22504715" 
    }, 
    { 
    "globalTradeID": 64200631, 
    "tradeID": 549284, 
    "date": "2016-11-11 23:48:39", 
    "type": "buy", 
    "rate": "10.33999822", 
    "amount": "0.18211700", 
    "total": "1.88308945" 
    }... 
] 

//Read response 
    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     return nil, fmt.Errorf("[Poloniex] (doRequest) Failed to parse response for query to %s! (%s)", reqURL, err.Error()) 
    } 

    //Convert JSON to struct 

    var THR TradeHistoryResponse 
    err = json.Unmarshal(body, &THR) 
    if err != nil { 
     return nil, fmt.Errorf("[Poloniex] (doRequest) Failed to convert response into JSON for query to %s! (%s)", reqURL, err.Error()) 
    } 

次のエラーが発生します。

(json: cannot unmarshal object into Go value of type poloniex.TradeHistoryResponse) 

Unmarshallが機能しない理由は、配列がキーなしであるためです。

この問題を解決するにはどうすればよいかについていくつかの説明があります。

+4

「配列がキーレス」であること、またはその問題が何であるかはわかりません。あなたのサンプルコードは動作します:https://play.golang.org/p/zbybX0tnRB – JimB

+2

@ nik-kunkelサンプルコードはうまくいきます。https://play.golang.org/p/743MBHL3Y4をご覧ください。私の最高のガスはあなたの体が正しくないということです。おそらくあなたが身体から読んでいるのはそのデータではありません。 – sadlil

+1

@JimBとNikが正しい場合は、取得しているボディをstdout/fileに書き出し、配列のすべての要素がデコードしようとしている型と一貫性があるかどうかを確認してください。 –

答えて

1

私は、JSONの配列をunmarhsalling思いませんでしたエンコーディングの小道具/ jsonにはそれがあります。サンプルコード:予想通り パッケージメイン

import (
    "encoding/json" 
    "fmt" 
    "log" 
) 

var mjs string = "[" + 
    "{" + 
    `"globalTradeID": 64201000, 
          "tradeID": 549285, 
          "date": "2016-11-11 23:51:58", 
          "type": "buy", 
          "rate": "10.33999779", 
          "amount": "0.02176472", 
          "total": "0.22504715" 
         }, 
         { 
          "globalTradeID": 64200631, 
          "tradeID": 549284, 
          "date": "2016-11-11 23:48:39", 
          "type": "buy", 
          "rate": "10.33999822", 
          "amount": "0.18211700", 
          "total": "1.88308945" 
         } 
         ]` 

type TradeHistoryResponse []TradeHistoryInfo 

type TradeHistoryInfo struct { 
    GlobalTradeID int64 `json:"globalTradeID"` 
    TradeID  int64 `json:"tradeID"` 
    Date   string `json:"date"` 
    Type   string `json:"type"` 
    Rate   float64 `json:"rate,string"` 
    Amount  float64 `json:"amount,string"` 
    Total   float64 `json:"total,string"` 
} 

func main() { 

    //Convert JSON to struct 

    var THR TradeHistoryResponse 
    err := json.Unmarshal([]byte(mjs), &THR) 
    if err != nil { 
    log.Fatal(err) 
    } 
    for _, v := range THR { 
    fmt.Printf("%+v", v) 
    fmt.Printf("\n") 
    } 
} 

これは、すべての値を出力します。だから、jsonの値をfloat/intに変換するのに問題はありません(これは私の2番目の推測でした)。

体を改造していないのですか?そして、あなたが与えた例は、すべてのエッジケースをカバーしていますか?第2のエラーブロックに

fmt.Println(string(body)) 

をし、それがここに与えるエラーを記録:

あなたが追加することができます。

また、使用しているバージョンは何ですか?私は、バージョン間でエンコーディング/ jsonが変更されている可能性を排除しません。

fmtBody := strings.Replace(string(body), "\n", "", -1) 
fmtBody = strings.Replace(string(fmtBody), "\w", "", -1) 
fmtBody = strings.Replace(string(fmtBody), "[", "", -1) 
fmtBody = strings.Replace(string(fmtBody), "]", "", -1) 
var goArrOfYourJsonsObj []String = strings.Split(fmtBody, "},{") 
for k, _ := range goArrOfYourJsonsObj { 
    goArrOfYourJsonsObj[k] += "}" 
} 

そして今、あなたはJSONオブジェクトを持っている:これは確かにそうであるならば終わりでは、簡単な修正はのように「'{}」で、すべての空白や分割を削除、文字列としてあなたの応答を取ることになりますUnmarshallで[] byte(val)として使用できる型Stringのgo配列にきれいに分かれています。

+0

体が正しいデータを含んでいないという理論で正しいです。私はエラーを返すサーバーをキャッチするメソッドを実装しましたが、動作していないようです。さらに検討したところ、URLパラメータが正しくエンコードされていなかったため、サーバーがエラーを返していたようです。 –

0

TradeHistoryResponseはありません変数の型である、あなたはタイプTradeHistoryResponseのVARを作成する必要があり、このように:あなたが実際に動作意図のよう

var th TradeHistoryResponse 

//Convert JSON to struct 
err = json.Unmarshal(body, &th) 
// ... 

fmt.Printf("%+v\n", th) 
+0

これは実際に私が投稿しなければならなかったコードの量を最小限に抑えるためにこの投稿を作成する際に間違いでした。 Unmarshall関数では、2番目のパラメータは実際にTradeHistoryResponseの変数です。 私はこれを反映するために元の投稿を編集したことに注意してください。 –

関連する問題