私は、次のしている:構造体のjsonタグを動的に変更するにはどうすればよいですか?
package main
import (
"encoding/json"
"fmt"
"os"
"reflect"
)
type User struct {
ID int64 `json:"id"`
Name string `json:"first"` // want to change this to `json:"name"`
tag string `json:"-"`
Another
}
type Another struct {
Address string `json:"address"`
}
func (u *User) MarshalJSON() ([]byte, error) {
value := reflect.ValueOf(*u)
for i := 0; i < value.NumField(); i++ {
tag := value.Type().Field(i).Tag.Get("json")
field := value.Field(i)
fmt.Println(tag, field)
}
return json.Marshal(u)
}
func main() {
anoth := Another{"123 Jennings Street"}
_ = json.NewEncoder(os.Stdout).Encode(
&User{1, "Ken Jennings", "name",
anoth},
)
}
私はJSONエンコードに構造体をしようとしていますが、私は、私はJSONのキーを変更する必要があります前に...例えば、最終的なJSONは次のようになります。
{"id": 1, "name": "Ken Jennings", "address": "123 Jennings Street"}
value.Type()。Field(i).Tag.Get( "json")のメソッドに気付きましたが、セッターメソッドはありません。どうして?希望のjson出力を得るにはどうすればいいですか?
また、組み込みのstruct anotherを含む、すべてのフィールドをどのように反復処理しますか?
https://play.golang.org/p/Qi8Jq_4W0t
タグは設定可能なフィールドではなく、タイプの一部です。 – JimB
これにはクリーンな解決策がないかもしれません。汚れたものの1つがコード生成を使用しています。 – ymonad
json.Marshaler(https://golang.org/pkg/encoding/json/#Marshaler)インターフェイスを実装して、構造タグを無視するか、任意のフィールドに任意の名前を付けることができます。 – elithrar