/ Goでの/非整列化されたgeneric json - json、generic、go

Go - json、ジェネリックス、ジェネリックでジェネリックを非整列化する

私は新しいGoプログラマー(From Java)であり、Javaで使うのが簡単な一般的な方法を再現したいと思います。

コードの重複を避けるためにJSON文字列に対して非整列化を実行できるようにする関数を作成したいと思います。

これは動作していない私の現在のコードです:

type myStruct1 struct {
id string
name string
}

func (obj myStruct1) toString() string {
var result bytes.Buffer
result.WriteString("id : ")
result.WriteString(obj.id)
result.WriteString("n")
result.WriteString("name : ")
result.WriteString(obj.name)

return result.String()
}

func main() {

content := `{id:"id1",name="myName"}`
object := myStruct1{}
parseJSON(content, object)

fmt.Println(object.toString())
}

func parseJSON(content string, object interface{}) {
var parsed interface{}
json.Unmarshal([]byte(content), &parsed)
}

このコードを実行すると、これが返されます。

id :
name :

あなたは何か考えていますか?

ありがとう

回答:

回答№1は2

問題はあなたがジェネリック型に書きたいですか?あなたはおそらく文字列マップが欲しいです。とにかくこれはBSONで動作します。

var anyJson map[string]interface{}
json.Unmarshal(bytes, &anyJson)

次のようにフィールドにアクセスできるようになります。

anyJson["id"].(string)

入力することを忘れないでください 必須 正しい型にするか、パニックになるでしょう(ゴランサイトで型アサーションの詳細を読むことができます)。


回答№2の場合は0

あなたのフィールドをエクスポートする必要があります。

type myStruct1 struct {
Id string
Name string
}

見る エクスポートされた識別子 ドキュメントから。


回答№3の場合は0

コードを機能させるには、コードにいくつかの変更を加える必要があります。

  1. 関数 json.Unmarshal エクスポートされる、つまり大文字で始まる変数のみを構造体内に設定できます。のようなものを使う ID そして Name 内部の変数名について myStruct1.
  2. あなたのコンテンツは無効なJSONです。あなたが本当に欲しいのは {"ID":"id1","Name":"myName"}.
  3. あなたは過ぎている objectparseJSON しかし、あなたは「使用しています parsed そうではなくて object。作る parseJSON aを受け取る *myStruct (の代わりに interface{})の代わりにその変数を使用します。 parsed 文字列を非整列化するとき。また、 常に 次のようにエラーの戻り値を処理します。 err := json.Unmarshal(content, object)、チェック err.

私はあなたに ゴランツアー ;)


回答№4の場合は0

非整列化は構造体のエクスポートされたフィールドのみを設定します。

つまり、大文字と小文字を使用するようにjson構造体を変更する必要があります。

type myStruct1 struct {
Id string
Name string
}

その理由は、jsonライブラリには、エクスポートされていない限り、reflectを使用してフィールドを表示する機能がないためです。