###前提・実現したいこと
- GoでJSONに値を追加する関数を作成したく、以下のようなset関数を作成しました。
(処理内容は質問用にシンプルにしてあります)
- ["value1"]という元のJSONをset関数で["value1", "value2"]に変更できれば成功です。
###発生している問題・エラーメッセージ
- しかし、実際には["value1"]のままになってしまいます。
- コード実行時の出力は下記のコメントの通りです。
###該当のソースコード
package main import ( "fmt" "encoding/json" "reflect" ) func main() { jsonStr := `["value1"]` var obj interface{} json.Unmarshal(([]byte)(jsonStr), &obj) set(obj, "value2") fmt.Println("result=", obj) // ["value1"]のままになり、追加できない } func set(obj interface{}, value interface{}) { v := reflect.ValueOf(obj) // いきなり v.Index(1) を指定するとindex out of range のエラーが出るので、ダミーを append s := "dummy" sr := reflect.ValueOf(s) v = reflect.Append(v, reflect.Indirect(sr)) fmt.Println("v=", v) // [value1, dummy] // 上で作成した dummy を指定 v = v.Index(1) fmt.Println("v=", v) // dummy // dummy を value2 で上書き v.Set(reflect.Indirect(reflect.ValueOf(value))) fmt.Println("v=", v) // value2 }
###試したこと
reflect.Append関数の入力と出力で使われているvが同じ実体を指していることを期待していましたが、どうもそうではないようなので、アサーション等を試してみましたがNGでした。
###質問
様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/28 02:03