ホームページ バックエンド開発 Golang golangのjson操作を詳しく解説した記事

golangのjson操作を詳しく解説した記事

Mar 29, 2023 pm 02:24 PM
golang json

この記事では、golang に関する知識を紹介し、主に golang の json 操作について紹介します。興味のある友達は一緒に見てください。皆様のお役に立てれば幸いです。

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))}
ログイン後にコピー
Print: シリアル化後: {"Name": "tom", "Age": 12, "Skill": "football"}

(2) JSON を変換するには文字列を構造体に変換すると、json.Unmarshal() メソッド

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:&quot;stu_name&quot;` Age int       `json:&quot;stu_age&quot;` Skill string  // 也可以不指定 tag标签,默认就是 变量名称}func main()  { stu := Student{&quot;tom&quot;, 12, &quot;football&quot;} data, err := json.Marshal(&amp;stu) if err != nil { fmt.Printf(&quot;序列化错误 err=%v\n&quot;, err) return } fmt.Println(&quot;序列化后: &quot;, string(data))}</pre><div class="contentsignin">ログイン後にコピー</div></div> を出力すると、キーの名前が指定したタグ ラベルの名前に変更されたことがわかります

シリアル化後: {"stu_name":"tom ","stu_age":12,"Skill":"football"}


2. マップを 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}
ログイン後にコピー
## に変換します。

#3. 構造体の変数をタグなしの json データに変換できますか?

変数の最初の文字が小文字の場合、その変数はプライベートです。反射情報が取得できないため転送できません。

    変数の最初の文字が大文字の場合、その変数はパブリックです。タグの有無に関わらず正常に変換でき、タグ付き変数はタグ名に従って表示されます。
  • 例:
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"}}
ログイン後にコピー
印刷を通じて、age や addr などの小文字の変数が JSON データに変換されていないことがわかりました。

まとめ:

先頭文字が小文字の場合はタグを付けても付けなくても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) フィールドを追加

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"}

#(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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

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

PPROFツールを使用してGOパフォーマンスを分析しますか? PPROFツールを使用してGOパフォーマンスを分析しますか? Mar 21, 2025 pm 06:37 PM

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

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

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

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

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

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? Apr 02, 2025 am 09:12 AM

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

Go FMTコマンドとは何ですか?なぜそれが重要なのですか? Go FMTコマンドとは何ですか?なぜそれが重要なのですか? Mar 20, 2025 pm 04:21 PM

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

Beego ormのモデルに関連付けられているデータベースを指定する方法は? Beego ormのモデルに関連付けられているデータベースを指定する方法は? Apr 02, 2025 pm 03:54 PM

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

See all articles