golang でオブジェクトを json に変換することは非常に一般的なことであり、ほとんどの golang 開発者が遭遇すると思います。この記事では、golang でオブジェクトを json に変換する方法とテクニックを共有します。
最初に、golang 標準ライブラリで提供されているエンコーディング/json パッケージを確認します。このパッケージは、オブジェクトを json 形式の文字列に変換したり、json 形式の文字列をオブジェクトに簡単に変換したりできる、非常にシンプルで使いやすい関数と型を提供します。
オブジェクトはエクスポート可能である必要がある (つまり、最初の文字が大文字である) 必要があることに注意してください。そうでない場合、json パッケージはそのフィールドにアクセスできません。
次は、encoding/json パッケージを使用して Student オブジェクトを json 形式の文字列に変換する簡単なコード例です。
package main import ( "encoding/json" "fmt" ) type Student struct { Name string Age int Score float64 } func main() { s := Student{ Name: "Tom", Age: 18, Score: 90.5, } b, err := json.Marshal(s) if err != nil { fmt.Println("json.Marshal failed:", err) return } fmt.Println(string(b)) }
出力:
{"Name":"Tom","Age":18,"Score":90.5}
可能な限りjson パッケージが提供するものを参照してください。 Marshal 関数は、構造オブジェクトを json 形式の文字列にシリアル化できます。
複雑なオブジェクトの場合は、json 形式の文字列に簡単にシリアル化することもできます。たとえば、次の配列は複数の Student オブジェクトで構成されています:
package main import ( "encoding/json" "fmt" ) type Student struct { Name string Age int Score float64 } func main() { students := []Student{ {Name: "Tom", Age: 18, Score: 90.5}, {Name: "Jerry", Age: 19, Score: 96.5}, {Name: "Alice", Age: 17, Score: 85.5}, } b, err := json.Marshal(students) if err != nil { fmt.Println("json.Marshal failed:", err) return } fmt.Println(string(b)) }
出力:
[{"Name":"Tom","Age":18,"Score":90.5},{"Name":"Jerry","Age":19,"Score":96.5},{"Name":"Alice","Age":17,"Score":85.5}]
同様に、json パッケージによって提供される Unmarshal 関数を使用して、json 形式の文字列をオブジェクトに解析できます。 。例:
package main import ( "encoding/json" "fmt" ) type Point struct { X int `json:"x"` Y int `json:"y"` } type Line struct { Start Point `json:"start"` End Point `json:"end"` } func main() { jsonStr := ` { "start": { "x": 1, "y": 2 }, "end": { "x": 3, "y": 4 } }` var line Line err := json.Unmarshal([]byte(jsonStr), &line) if err != nil { fmt.Println("json.Unmarshal failed:", err) return } fmt.Printf("%#v ", line) }
出力:
main.Line{Start:main.Point{X:1, Y:2}, End:main.Point{X:3, Y:4}}
このサンプル コードでは、2 つの Point オブジェクトを含む Line オブジェクトを定義します。 json パッケージが提供する Unmarshal 関数を使用して、json 形式の文字列を Line オブジェクトに解析して出力します。
フィールド名の変更など、json 形式の出力をカスタマイズしたい場合は、どうすればよいですか?それについて?このとき、golangのstructタグが便利です。
golang では、struct タグは構造体フィールドに注釈を付ける方法であり、フィールド タイプの後に文字列を追加することで実現できます。 json パッケージのシリアル化と逆シリアル化を使用する場合、struct タグを使用してシリアル化と逆シリアル化のプロセスを制御できます。
以下は、struct タグを使用して JSON のシリアル化と逆シリアル化のプロセスを制御する方法を示す簡単なサンプル コードです。
package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"name"` Age int `json:"age"` Score float64 } func main() { s := Student{ Name: "Tom", Age: 18, Score: 90.5, } fmt.Println("*** 序列化 ***") b, err := json.Marshal(s) if err != nil { fmt.Println("json.Marshal failed:", err) return } fmt.Println(string(b)) fmt.Println("*** 反序列化 ***") jsonStr := `{"name":"Tom","age":18,"Score":90.5}` var student Student err = json.Unmarshal([]byte(jsonStr), &student) if err != nil { fmt.Println("json.Unmarshal failed:", err) return } fmt.Printf("%#v ", student) }
出力:
*** 序列化 *** {"name":"Tom","age":18,"Score":90.5} *** 反序列化 *** main.Student{Name:"Tom", Age:18, Score:90.5}
ここでは、 Student オブジェクトの Name フィールドは「name」としてマークされているため、json.Marshal 関数を使用してシリアル化すると、その名前は「name」に変更されます。同様に、json.Unmarshal 関数を使用して逆シリアル化する場合、「name」が Name フィールドとして自動的に認識されます。
struct タグの形式を通じて、json 出力内のフィールドの表示/非表示を制御することもできます。例:
package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"name,omitempty"` Age int `json:"age"` Score float64 } func main() { s := Student{ Age: 18, Score: 90.5, } fmt.Println("*** 序列化 ***") b, err := json.Marshal(s) if err != nil { fmt.Println("json.Marshal failed:", err) return } fmt.Println(string(b)) fmt.Println("*** 反序列化 ***") jsonStr := `{"name":"Tom","age":18,"Score":90.5}` var student Student err = json.Unmarshal([]byte(jsonStr), &student) if err != nil { fmt.Println("json.Unmarshal failed:", err) return } fmt.Printf("%#v ", student) }
出力:
*** 序列化 *** {"age":18,"Score":90.5} *** 反序列化 *** main.Student{Name:"Tom", Age:18, Score:90.5}
ここでは、Name フィールドを "omitempty" としてマークします。これは、Name フィールドの値がゼロ (つまり "") の場合、 json が出力されます。このフィールドは無視してください。
より複雑な JSON のシリアル化と逆シリアル化を実行する必要がある場合、golang 標準ライブラリは少し弱い可能性があります。現時点では、より柔軟な運用を実現するために、いくつかのサードパーティ ライブラリを使用できます。
次は、json のシリアル化と逆シリアル化にサードパーティのライブラリを使用するサンプル コードです。このサンプル コードでは、現時点で最速の golang json ライブラリの 1 つである json-iterator/go パッケージを使用します。
package main import ( "fmt" "github.com/json-iterator/go" ) type Student struct { Name string `json:"name"` Age int `json:"age"` Score float64 `json:"score,omitempty"` } func main() { student := Student{ Name: "Tom", Age: 18, Score: 0, } fmt.Println("*** 序列化 ***") json := jsoniter.ConfigCompatibleWithStandardLibrary b, err := json.Marshal(student) if err != nil { fmt.Println("json.Marshal failed:", err) return } fmt.Println(string(b)) fmt.Println("*** 反序列化 ***") jsonStr := `{"name":"Tom","age":18}` err = json.Unmarshal([]byte(jsonStr), &student) if err != nil { fmt.Println("json.Unmarshal failed:", err) return } fmt.Printf("%#v ", student) }
出力:
*** 序列化 *** {"name":"Tom","age":18} *** 反序列化 *** main.Student{Name:"Tom", Age:18, Score:0}
サードパーティのライブラリを使用すると、より柔軟な json 操作を実現できますが、パフォーマンスの低下やコードの複雑さの増加などの問題が発生する可能性があることに注意してください。特定のシナリオに基づいて作成する必要があります。
この記事では、golang でオブジェクトを json に変換するためのいくつかの方法とテクニックを紹介します。この記事が読者の役に立つことを願っています。
以上がGolang オブジェクトを JSON に変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。