0

(静的スキーマ) json ファイルから大量のデータをデコードしたいと考えています。ファイルには数値データのみが含まれ、キーはすべて整数です。このjsonを、json.Unmarshalのフィールドを含む構造体にデコードする方法、map[string]intまたはmap[string]float32json.Unmarshalを使用する方法を知っています。しかし、文字列キーには興味がありません。どうにかしてそれらを int に変換する必要があります。

だから私が知りたいのは:

  1. これを達成する方法はありますか。つまり、map[int]float32 タイプのフィールドを含む構造体をデコードから直接取得する方法はありますか?
  2. そうでなければ、メモリ効率の良い方法で、デコード後にこれを達成する方法は?

ありがとう

4

2 に答える 2

6

JSON 形式は、文字列キーを持つキー/値オブジェクトのみを指定します。このため、encoding/jsonパッケージは文字列キーのみをサポートします。

json/encodingドキュメントには次のように記載されています。

bool、JSON
booleans の場合 float64、JSON 数値の場合
string、JSON 文字列の場合
[]interface{}、JSON 配列の場合
map[string]interface{}、JSON オブジェクトの場合
nil JSON null の場合

パッケージを使用encoding/jsonして map[int]float64 に移動する場合は、次のようにします (float32 でも機能します)。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    a := map[string]float64{"1":1, "2":4, "3":9, "5":25}
    b := make(map[int]float64, len(a))

    for k,v := range a {
        if i, err := strconv.Atoi(k); err == nil {
            b[i] = v
        } else {
            // A non integer key
        }
    }

    fmt.Printf("%#v\n", b)
}

遊び場

于 2013-08-28T13:25:24.787 に答える
0

encoding/jsonパッケージにはUnmarshaler、単一のメソッドを持つインターフェースが含まれています: UnmarshalJSON(data []byte) error.

勇気がある場合は、次のように実装できます。

type IntToFloat map[int]float32

func (itf *IntToFloat) UnmarshalJSON(data []byte) error {
    if itf == nil {
        return errors.New("Unmarshalling JSON for a null IntToFload")
    }
    // MAGIC Goes here.
    return nil
}

編集

注: http://golang.org/src/pkg/encoding/json/decode.go?s=2221:2269#L53は、Unmarshal の std ライブラリ バージョンのソースです。

http://golang.org/pkg/encoding/json/#Unmarshalerは、上記のインターフェイスの由来です。

于 2013-08-28T16:07:48.757 に答える