golangのjson操作を詳しく解説した記事
この記事では、golang に関する知識を紹介し、主に golang の json 操作について紹介します。興味のある友達は一緒に見てください。皆様のお役に立てれば幸いです。
golang の json 操作# JSON は
軽量のデータ交換形式 です。読み書きが簡単です。 golang は、JSON データを操作するための encoding/json パッケージを提供します。
1. 構造体を JSON に変換する
(1) json.Marshal() メソッドを使用して、構造体を JSON 文字列に変換しますimport (
"encoding/json"
"fmt")type Student struct {
Name string
Age int
Skill string}func main() {
stu := Student{"tom", 12, "football"}
data, err := json.Marshal(&stu)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
return
}
fmt.Println("序列化后: ", string(data))}
func main() {
str := `{"Name":"tom","Age":12,"Skill":"football"}`
var stu2 Student
err := json.Unmarshal([]byte(str), &stu2)
if err != nil {
fmt.Printf("反序列化错误 err=%v\n", err)
return
}
fmt.Printf("反序列化后: Student=%v, Name=%v\n", stu2, stu2.Name)}
を使用して次のように出力できます: 逆シリアル化後: Student={tom 12 Football} , Name=tom
(3) 構造体をシリアル化した後にキーの名前をカスタマイズできることを実現する方法カスタマイズされたキーの名前については、構造体変数で指定できます。
tag label<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">type Student struct {
Name string `json:"stu_name"`
Age int `json:"stu_age"`
Skill string // 也可以不指定 tag标签,默认就是 变量名称}func main() {
stu := Student{"tom", 12, "football"}
data, err := json.Marshal(&stu)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
return
}
fmt.Println("序列化后: ", string(data))}</pre><div class="contentsignin">ログイン後にコピー</div></div>
を出力すると、キーの名前が指定したタグ ラベルの名前に変更されたことがわかります
2. マップを JSONfunc main() {
// map 转 Json字符串
m := make(map[string]interface{})
m["name"] = "jetty"
m["age"] = 16
data, err := json.Marshal(&m)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
return
}
fmt.Println("序列化后: ", string(data)) // 打印: 序列化后: {"age":16,"name":"jetty"}
// Json字符串 转 map
str := `{"age":25,"name":"car"}`
err = json.Unmarshal([]byte(str), &m)
if err != nil {
fmt.Printf("反序列化错误 err=%v\n", err)
return
}
fmt.Printf("反序列化后: map=%v, name=%v\n", m, m["name"])
// 打印: 反序列化后: map=map[age:25 name:car], name=car}
ログイン後にコピー## に変換します。
#3. 構造体の変数をタグなしの json データに変換できますか? func main() { // map 转 Json字符串 m := make(map[string]interface{}) m["name"] = "jetty" m["age"] = 16 data, err := json.Marshal(&m) if err != nil { fmt.Printf("序列化错误 err=%v\n", err) return } fmt.Println("序列化后: ", string(data)) // 打印: 序列化后: {"age":16,"name":"jetty"} // Json字符串 转 map str := `{"age":25,"name":"car"}` err = json.Unmarshal([]byte(str), &m) if err != nil { fmt.Printf("反序列化错误 err=%v\n", err) return } fmt.Printf("反序列化后: map=%v, name=%v\n", m, m["name"]) // 打印: 反序列化后: map=map[age:25 name:car], name=car}
変数の最初の文字が小文字の場合、その変数はプライベートです。反射情報が取得できないため転送できません。
- 変数の最初の文字が大文字の場合、その変数はパブリックです。タグの有無に関わらず正常に変換でき、タグ付き変数はタグ名に従って表示されます。
- 例:
type User struct { Name string `json:"u_name"` age int `json:"u_age"` Skill string // 也可以不指定 tag标签,默认就是 变量名称 addr string}func main() { user := User{"admin", 23, "football", "上海"} data, err := json.Marshal(&user) if err != nil { fmt.Printf("序列化错误 err=%v\n", err) return } fmt.Println("序列化后: ", string(data)) // 打印: 序列化后: {"u_name":"admin","Skill":"football"}}
先頭文字が小文字の場合はタグを付けても付けなくてもjsonデータに変換できませんが、大文字の場合はjsonデータに変換できます。タグでエイリアス化されており、タグが追加されていない場合は json データに変換されます。フィールドは構造体変数の元の名前と一致します
4. JSON 操作に関するいくつかのヒント
(1) 構造体の指定されたフィールドを無視します
type User struct {
Name string `json:"u_name"`
Password string `json:"password"`
Email string `json:"email"`}func main() {
user := User{"admin", "pwd", "user@163.com"}
person := Person{23, "上海"}
// 忽略掉 Password 字段
data, _ := json.Marshal(struct {
*User
Password string `json:"password,omitempty"`
}{User: &user})
fmt.Println("忽略字段: ", string(data)) // 打印: 忽略字段: {"u_name":"admin","email":"user@163.com"}}
ログイン後にコピー
フィールドを無視します: {"u_name":"admin","email ":"user@163.com"}}
(2) フィールドを追加type User struct { Name string `json:"u_name"` Password string `json:"password"` Email string `json:"email"`}func main() { user := User{"admin", "pwd", "user@163.com"} person := Person{23, "上海"} // 忽略掉 Password 字段 data, _ := json.Marshal(struct { *User Password string `json:"password,omitempty"` }{User: &user}) fmt.Println("忽略字段: ", string(data)) // 打印: 忽略字段: {"u_name":"admin","email":"user@163.com"}}
data, _ = json.Marshal(struct {
*User
Skill string `json:"skill"` // 临时添加额外的 Skill字段}{
User: &user,
Skill: "football",})fmt.Println("添加额外字段: ", string(data))
ログイン後にコピー
フィールドを追加: {"u_name":"admin","パスワード":"pwd","email":"user@163.com","skill":"football"}
data, _ = json.Marshal(struct { *User Skill string `json:"skill"` // 临时添加额外的 Skill字段}{ User: &user, Skill: "football",})fmt.Println("添加额外字段: ", string(data))
#(3) 2 つの構造体をマージします
#type User struct { Name string `json:"u_name"` Password string `json:"password"` Email string `json:"email"`}type Person struct { Age int Addr string `json:"addr"`}func main() { // 初始化两个 struct user := User{"admin", "pwd", "user@163.com"} person := Person{23, "上海"} data, _ := json.Marshal(struct { *User *Person }{ User: &user, Person: &person, }) fmt.Println("合并两个struct: ", string(data))}
2 つの構造体をマージします: {"u_name":"admin","password":"pwd","email" : "user@163.com", "Age": 23, "addr": "Shanghai"}
(4) 文字列は int 型に渡されます
emp := struct { // 创建匿名 struct Num int `json:"num,string"`}{15,}data, _ := json.Marshal(&emp)fmt.Println("数字转成字符串: ", string(data)) // 数字转成字符串: {"num":"15"}str := `{"Num":"25"}`_ = json.Unmarshal([]byte(str), &emp)fmt.Printf("字符串转成数字: Emp.Num=%v\n", emp.Num) // 字符串转成数字: Emp.Num=25
(5) json は 2 つの構造体に分割されます
str = ` {"u_name":"system","password":"abc","email":"user2@163.com","Age":23,"addr":"杭州"}`var user2 Uservar person2 Person_ := json.Unmarshal([]byte(str), &struct { *User *Person}{ User: &user2, Person: &person2,})fmt.Printf("分成两个struct: User=%v, Person=%v\n", user2, person2)
は 2 つの構造体に分割されます: User={system abc user2@163.com}、Person={23 Hangzhou}
以上がgolangのjson操作を詳しく解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

この記事では、GOプログラミングのGo FMTコマンドについて説明します。これは、公式スタイルのガイドラインに準拠するためのコードをフォーマットします。コードの一貫性、読みやすさ、およびスタイルの議論を削減するためのGO FMTの重要性を強調しています。 Best Practices fo

Beegoormフレームワークでは、モデルに関連付けられているデータベースを指定する方法は?多くのBEEGOプロジェクトでは、複数のデータベースを同時に操作する必要があります。 Beegoを使用する場合...
