Go語言:json 作用和語法

在 Go 語言中,JSON 字段(也稱為 JSON Tag)是附加在結構體字段上的元數據,用于控制該字段在 JSON 編碼(序列化)和解碼(反序列化) 時的行為。它的語法是:

type StructName struct {FieldName FieldType `json:"json_field_name,option1,option2,..."`
}

例如:

type User struct {Name string `json:"name"`           // 字段在 JSON 中顯示為 "name"Age  int    `json:"age,omitempty"`  // 如果 Age 是零值,JSON 中會忽略它
}

JSON 字段的作用

指定 JSON 字段名

默認情況下,Go 結構體的字段名會直接作為 JSON 的鍵名(首字母大寫轉為小寫)。但通過 json Tag,可以自定義 JSON 中的鍵名:

type Message struct {Sender string `json:"sender"`  // Go 字段 `Sender` → JSON 鍵 `"sender"`
}
  • 輸入 Go 結構體
msg := Message{Sender: "Alice"}
  • 輸出 JSON
{"sender": "Alice"}

忽略空值字段

如果字段是零值(如 0""nil),加上 omitempty 后,該字段不會出現在 JSON 中:

type User struct {Name string `json:"name,omitempty"`  // 如果 Name 是 "",JSON 中不會包含該字段Age  int    `json:"age,omitempty"`   // 如果 Age 是 0,JSON 中不會包含該字段
}
  • 輸入 Go 結構體
user := User{Age: 0}
  • 輸出 JSON
{}

忽略字段(-

如果某個字段不需要出現在 JSON 中,可以用 - 忽略它:

type Config struct {Password string `json:"-"`  // 該字段不會參與 JSON 序列化
}
  • 輸入 Go 結構體
cfg := Config{Password: "123456"}
  • 輸出 JSON
{}

encoding/json

在 go 中,encoding/json包下提供對應的函數來進行 json 的序列化與反序列化,主要使用的有如下函數。

func Marshal(v any) ([]byte, error) //將go對象序列化為json字符串func Unmarshal(data []byte, v any) error //將json字符串反序列化為go對象

首先定義結構體

type Person struct {UserId   stringUsername stringAge      intAddress  string
}

序列化

func main() {person := Person{UserId:   "120",Username: "jack",Age:      18,Address:  "usa",}bytes, err := json.Marshal(person)if err != nil {fmt.Println(err)return}fmt.Println(string(bytes))
}

結果

{ "UserId": "120", "Username": "jack", "Age": 18, "Address": "usa" }

字段重命名

我們可以通過結構體標簽來達到重命名的效果。

type Person struct {UserId   string `json:"id"`Username string `json:"name"`Age      int    `json:"age"`Address  string `json:"address"`
}

此時輸出

{ "id": "1202", "name": "jack", "age": 19, "address": "USA" }

縮進

序列化時默認是沒有任何縮進的,這是為了減少傳輸過程的空間損耗,但是這并不利于人為觀察,在一些情況下我們需要將其序列化成人類能夠觀察的形式。為此,只需要換一個函數。

func main() {person := Person{UserId:   "1202",Username: "jack",Age:      19,Address:  "USA",}bytes, err := json.MarshalIndent(person, "", "\t")if err != nil {fmt.Println(err)return}fmt.Println(string(bytes))
}

輸出如下

{"id": "1202","name": "jack","age": 19,"address": "USA"
}

反序列化

在反序列化時需要注意,如果結構體有 json 標簽的話,則字段名優先以 json 標簽為準,否則以結構體屬性名為準。

func main() {person := Person{}jsonStr := "{\"id\":\"120\",\"name\":\"jack\",\"age\":18,\"address\":\"usa\"}\n"err := json.Unmarshal([]byte(jsonStr), &person)if err != nil {fmt.Println(err)return}fmt.Printf("%+v", person)
}

輸出

{UserId:120 Username:jack Age:18 Address:usa}

參考資料:

Golang 中文學習文檔 標準庫 encoding/json包

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80683.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80683.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80683.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MATLAB復制Excel數據到指定區域

Matlab中如何將Excel表中的265-528行F-AA列數據復制到1-263行AE-AZ中 版本:MatlabR2018b clc; clear; %舊Excel文件名 oldFile ; %新Excel文件名 newFile ; % 工作表名稱(舊表和新表一致) sheetName Sheet1; % 舊文件中待復制的數據范…

vue3+flask+sqlite前后端項目實戰

基礎環境安裝 pycharm 下載地址: https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下載地址 https://code.visualstudio.com/docs/?dvwin64user python 下載地址 https://www.python.org/downloads/windows/ Node.js(含npm…

Java 內存模型(JMM)與內存屏障:原理、實踐與性能權衡

Java 內存模型(JMM)與內存屏障:原理、實踐與性能權衡 在多線程高并發時代,Java 內存模型(JMM) 及其背后的內存屏障機制,是保障并發程序正確性與性能的基石。本文將系統梳理 JMM 的核心原理、內…

動手學深度學習12.3.自動并行-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記,以及對課后練習的一些思考,自留回顧,也供同學之人交流參考。 本節課程地址:無 本節教材地址:12.3. 自動并行 — 動手學深度學習 2.0.0 documentation 本節開源代…

C++類和對象之初始化列表

初始化列表 C初始化列表詳解:性能優化與正確實踐什么是初始化列表?初始化列表的三大核心作用1. 性能優化:避免不必要的賦值操作2. 強制初始化:處理const和引用成員3. 基類初始化:正確調用父類構造函數4.必須使用初始化…

continue通過我們的開源 IDE 擴展和模型、規則、提示、文檔和其他構建塊中心,創建、共享和使用自定義 AI 代碼助手

?一、軟件介紹 文末提供程序和源碼下載 Continue 使開發人員能夠通過我們的開源 VS Code 和 JetBrains 擴展以及模型、規則、提示、文檔和其他構建塊的中心創建、共享和使用自定義 AI 代碼助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…

基于Spring Boot + Vue的母嬰商城系統( 前后端分離)

一、項目背景介紹 隨著母嬰行業在互聯網平臺的快速發展,越來越多的家庭傾向于在線選購母嬰產品。為了提高商品管理效率和用戶購物體驗,本項目開發了一個基于 Spring Boot Vue 技術棧的母嬰商城系統,實現了商品分類、商品瀏覽、資訊展示、評…

實戰演練:用 AWS Lambda 和 API Gateway 構建你的第一個 Serverless API

實戰演練:用 AWS Lambda 和 API Gateway 構建你的第一個 Serverless API 理論千遍,不如動手一遍!在前面幾篇文章中,我們了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。現在,是時候把這些知識運用起來,親手構建一個簡單但完整的 Serverless 應用了。 …

node.js 實戰——express圖片保存到本地或服務器(七牛云、騰訊云、阿里云)

本地 ? 使用formidable 讀取表單內容 npm i formidable ? 使用mime-types 獲取圖片后綴 npm install mime-types? js 中提交form表單 document.getElementById(uploadForm).addEventListener(submit, function(e){e.preventDefault();const blob preview._blob;if(!blob)…

2025最新:3分鐘使用Docker快速部署單節點Redis

🧑?🏫 詳細教程:通過 Docker 安裝單節點 Redis 🛠? 前提條件: 你需要在 Ubuntu 系統上進行操作(如果你在其他系統上操作,可以按相似步驟進行調整)。已安裝 Docker 和 Docker Com…

CentOS 7 系統下安裝 OpenSSL 1.0.2k 依賴問題的處理

前面有提到過這個openssl的版本沖突問題,也是在這次恢復服務器時遇到的問題,我整理如下,供大家參考。小小一個軟件的安裝,挺坑的。 一、問題 項目運行環境需要,指定PHP7.0.9這個版本,但是?系統版本與軟件…

LoRA(Low-Rank Adaptation)原理詳解

LoRA(Low-Rank Adaptation)原理詳解 LoRA(低秩適應)是一種參數高效微調(Parameter-Efficient Fine-Tuning, PEFT)技術,旨在以極低的參數量實現大模型在特定任務上的高效適配。其核心思想基于低秩分解假設,即模型在適應新任務時,參數更新矩陣具有低秩特性,可用少量參…

Solana批量轉賬教程:提高代幣持有地址和生態用戶空投代幣

前言 Solana區塊鏈因其高吞吐量和低交易費用成為批量操作(如空投)的理想選擇。本教程將介紹幾種在Solana上進行批量轉賬的方法,幫助您高效地向多個地址空投代幣。 solana 賬戶模型 在Solana中有三類賬戶: 數據賬戶,…

基于LSTM與SHAP可解釋性分析的神經網絡回歸預測模型【MATLAB】

基于LSTM與SHAP可解釋性分析的神經網絡回歸預測模型【MATLAB】 一、引言 在數據驅動的智能時代,時間序列預測已成為許多領域(如金融、氣象、工業監測等)中的關鍵任務。長短期記憶網絡(LSTM)因其在捕捉時間序列長期依…

手機網頁提示ip被拉黑名單什么意思?怎么辦

?當您使用手機瀏覽網頁時,突然看到“您的IP地址已被列入黑名單”的提示,是否感到困惑和不安?這種情況在現代網絡生活中并不罕見,但確實會給用戶帶來諸多不便。本文將詳細解釋IP被拉黑的含義、常見原因,并提供一系列實…

Java消息隊列性能優化實踐:從理論到實戰

Java消息隊列性能優化實踐:從理論到實戰 1. 引言 在現代分布式系統架構中,消息隊列(Message Queue,MQ)已經成為不可或缺的中間件組件。它不僅能夠實現系統間的解耦,還能提供異步通信、流量削峰等重要功能…

BUUCTF——Cookie is so stable

BUUCTF——Cookie is so stable 進入靶場 頁面有點熟悉 跟之前做過的靶場有點像 先簡單看一看靶場信息 有幾個功能點 flag.php 隨便輸了個admin 根據題目提示 應該與cookie有關 抓包看看 構造payload Cookie: PHPSESSIDef0623af2c1a6d2012d57f3529427d52; user{{7*7}}有…

json格式不合法情況下,如何盡量保證數據可用性

背景 在工作流程中,并非所有數據都如人所愿,即使json版本也會由于csv、tsv、excel、text等不同文件格式轉化、獲取數據源不完整等問題,造成我們要處理的json文件存在不合法。 嘗試方案 除了人為修正外,有效的方法是使用json“修…

Python基礎總結(十)之函數

Python函數 函數是Python中也是非常重要的,函數是帶名字的代碼塊,用于完成具體的工作。要執行函數定義的特定任務,可調用該函數。 一、函數的定義 函數的定義要使用def關鍵字,def后面緊跟函數名,縮進的為函數的代碼塊。 def test():print("Hello,World")上述…

懶人美食幫SpringBoot訂餐系統開發實現

概述 快速構建一個訂餐系統,今天,我們將通過”懶人美食幫”這個基于SpringBoot的訂餐系統項目,為大家詳細解析從用戶登錄到多角色權限管理的完整實現方案。本教程特別適合想要學習企業級應用開發的初學者。 主要內容 1. 用戶系統設計與實現…