私は新しい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
コードを機能させるには、コードにいくつかの変更を加える必要があります。
- 関数
json.Unmarshal
エクスポートされる、つまり大文字で始まる変数のみを構造体内に設定できます。のようなものを使うID
そしてName
内部の変数名についてmyStruct1
. - あなたのコンテンツは無効なJSONです。あなたが本当に欲しいのは
{"ID":"id1","Name":"myName"}
. - あなたは過ぎている
object
にparseJSON
しかし、あなたは「使用しています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を使用してフィールドを表示する機能がないためです。