2017-07-25 9 views
0

私は移動先です。私は構造体にjsonデータをフェッチしてマーシャリングしようとしていました。移動json.Unmarshalフィールドの場合

var reducedFieldData = []byte(`[ 
    {"model":"Traverse","vin":"1gnkrhkd6ej111234"} 
    ,{"model":"TL","vin":"19uua66265a041234"} 
]`) 

私はこのようなデータを受信するための構造体を定義した場合::

type Vehicle struct { 
    Model string 
    Vin string 
} 

を非整列化の呼び出しが期待どおりに動作私のサンプルデータは、次のようになります。しかし、データのフィールド名の大文字と小文字を実際に一致させるフィールド( "model"と "vin")に小文字を使用すると、値の空の文字列が返されます。

これが期待どおりの動作ですか?大会はオフにできますか?

+3

[私の構造はjsonにマーシャリングされていません](https://stackoverflow.com/questions/15452004/my-structures-are-not-marshalling-into-json) – RickyA

答えて

2

フィールドをエクスポートする必要があります(大文字の最初の文字で宣言します)。リフレクションライブラリはフィールドを編集できません。 JSON(un)Marshallerはリフレクションを使用するため、非公開フィールドの読み書きはできません。

はい、期待していますが、変更することはできません。ごめんなさい。

あなたはマーシャラーが使用する名前を変更するには、フィールドにタグを追加することができます

Model string `json:"model"` 

は、フィールドタグ「エンコーディング/ jsonの」サポートに関する詳しい情報は、the documentationを参照してください。

+0

回答ありがとうございます。 「モデル」と「モデル」の両方を含む文書をアンマーシャリングしようとするとどうなりますか?明らかに、これを定義したくはありませんが、データソースの定義方法を常に制御するわけではありません:) – jrf

+0

フィールド "Model"はAFAIKには保存されません。構造体に2つのフィールド(適切なタグ付き)を追加できますが、それは面倒です。ライブラリは、フィールド名が大文字と小文字を区別することを前提としており、簡単に回避する方法はありません。両方を本当に処理する必要がある場合は、必要なものについては、[このドキュメントの一部](https://golang.org/pkg/encoding/json/#Unmarshaler)を参照してください。 –

関連する問題