在數據交換與存儲中,JSON、CSV、XML 是常見格式。Go 標準庫為這些格式提供了強大且易用的支持,涵蓋結構體映射、讀寫文件、編碼解碼等操作。
一、JSON處理(encoding/json
)
1. 基本使用:結構體 <-> JSON
type?User?struct?{Name??string?`json:"name"`Age???int????`json:"age"`Email?string?`json:"email,omitempty"`?//?可選字段
}user?:=?User{Name:?"Alice",?Age:?30}
data,?_?:=?json.Marshal(user)
fmt.Println(string(data))?//?{"name":"Alice","age":30}
2. 反序列化 JSON -> 結構體
jsonStr?:=?`{"name":"Bob","age":25}`
var?u?User
err?:=?json.Unmarshal([]byte(jsonStr),?&u)
fmt.Printf("%+v\n",?u)
3. 處理嵌套結構、數組、map
type?Post?struct?{ID?????intAuthor?UserTags???[]string
}post?:=?Post{ID:?1,?Author:?user,?Tags:?[]string{"go",?"json"}}
jsonBytes,?_?:=?json.MarshalIndent(post,?"",?"??")
fmt.Println(string(jsonBytes))
二、CSV處理(encoding/csv
)
CSV 通常用于表格數據、Excel 導出等,Go 提供簡單讀寫接口。
1. 寫入 CSV 文件
file,?_?:=?os.Create("data.csv")
defer?file.Close()writer?:=?csv.NewWriter(file)
writer.Write([]string{"Name",?"Age",?"Email"})
writer.Write([]string{"Tom",?"22",?"tom@example.com"})
writer.Flush()
2. 讀取 CSV 文件
file,?_?:=?os.Open("data.csv")
defer?file.Close()reader?:=?csv.NewReader(file)
records,?_?:=?reader.ReadAll()
for?_,?record?:=?range?records?{fmt.Println(record)
}
3. 自定義分隔符(如?;
)
reader?:=?csv.NewReader(file)
reader.Comma?=?';'
CSV 不支持結構體直接映射,需手動轉換。
三、XML處理(encoding/xml
)
1. 基本結構體標簽
type?Note?struct?{To??????string?`xml:"to"`From????string?`xml:"from"`Message?string?`xml:"message"`
}
2. 序列化:結構體 -> XML
note?:=?Note{"Tom",?"Jerry",?"Hello,?XML!"}
data,?_?:=?xml.MarshalIndent(note,?"",?"??")
fmt.Println(xml.Header?+?string(data))
輸出:
<?xml?version="1.0"?encoding="UTF-8"?>
<Note><to>Tom</to><from>Jerry</from><message>Hello,?XML!</message>
</Note>
3. 反序列化:XML -> 結構體
input?:=?`<Note><to>Tom</to><from>Jerry</from><message>Hi</message></Note>`
var?n?Note
xml.Unmarshal([]byte(input),?&n)
fmt.Printf("%+v\n",?n)
4. 屬性與嵌套結構
type?Book?struct?{Title??string?`xml:"title,attr"`Author?string?`xml:"author"`
}type?Library?struct?{XMLName?xml.Name?`xml:"library"`Books???[]Book???`xml:"book"`
}
四、三者對比與適用場景
格式 | 特點 | 場景 |
JSON | 結構清晰、易于網絡傳輸 | Web API、前后端通信 |
CSV | 體積小、表格友好 | 報表導入導出、數據分析 |
XML | 可擴展、支持屬性與命名空間 | 配置文件、SOAP、嵌套數據 |
五、實戰建議
- ? 使用?
json.MarshalIndent
?便于調試輸出。 - ? 自定義字段名與?
omitempty
?控制輸出字段。 - ??
csv
?通常用于輕量級數據交換,不建議嵌套。 - ? 解析 XML 時注意標簽與命名空間。