Go JSON处理全攻略:编码解码实战
Go基础:JSON文件处理详解(标准库encoding/json)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于Web开发和数据传输。Go语言通过标准库encoding/json提供了强大的JSON处理能力,支持序列化(编码)和反序列化(解码)操作。
JSON序列化(编码)
将Go数据结构转换为JSON格式的过程称为序列化。encoding/json提供了Marshal和MarshalIndent函数实现这一功能。
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{Name: "Alice", Age: 30}
jsonData, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(jsonData))
}
MarshalIndent函数可以生成格式化的JSON,便于阅读:
jsonData, err := json.MarshalIndent(p, "", " ")
JSON反序列化(解码)
将JSON数据解析为Go数据结构的过程称为反序列化。encoding/json提供了Unmarshal函数实现这一功能。
func main() {
jsonStr := `{"name":"Alice","age":30}`
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", p)
}
处理JSON文件
读取JSON文件并解析为Go数据结构:
func readJSONFile(filename string) (Person, error) {
var p Person
data, err := os.ReadFile(filename)
if err != nil {
return p, err
}
err = json.Unmarshal(data, &p)
return p, err
}
将Go数据结构写入JSON文件:
func writeJSONFile(filename string, p Person) error {
data, err := json.MarshalIndent(p, "", " ")
if err != nil {
return err
}
return os.WriteFile(filename, data, 0644)
}
处理复杂JSON结构
对于嵌套或动态结构的JSON,可以使用map[string]interface{}或[]interface{}:
func handleComplexJSON(jsonStr string) {
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
log.Fatal(err)
}
fmt.Println(data)
}
自定义JSON字段名称
通过结构体标签(struct tags)可以自定义JSON字段名称:
type User struct {
Username string `json:"user_name"`
Email string `json:"email,omitempty"`
}
omitempty选项表示如果字段为空值(零值),则序列化时忽略该字段。
流式JSON处理
对于大型JSON数据,可以使用json.Decoder和json.Encoder进行流式处理:
func streamJSONDecode(r io.Reader) {
dec := json.NewDecoder(r)
for {
var p Person
if err := dec.Decode(&p); err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", p)
}
}
func streamJSONEncode(w io.Writer, people []Person) {
enc := json.NewEncoder(w)
for _, p := range people {
if err := enc.Encode(p); err != nil {
log.Fatal(err)
}
}
}
处理特殊数据类型
时间类型(time.Time)默认序列化为RFC3339格式字符串。自定义时间格式需要实现json.Marshaler和json.Unmarshaler接口:
type CustomTime time.Time
func (ct *CustomTime) MarshalJSON() ([]byte, error) {
t := time.Time(*ct)
return []byte(fmt.Sprintf(`"%s"`, t.Format("2006-01-02"))), nil
}
func (ct *CustomTime) UnmarshalJSON(data []byte) error {
t, err := time.Parse(`"2006-01-02"`, string(data))
if err != nil {
return err
}
*ct = CustomTime(t)
return nil
}
错误处理
JSON处理过程中可能遇到各种错误,如语法错误、类型不匹配等。合理的错误处理是保证程序健壮性的关键:
func safeUnmarshal(data []byte, v interface{}) error {
if err := json.Unmarshal(data, v); err != nil {
if syntaxErr, ok := err.(*json.SyntaxError); ok {
return fmt.Errorf("syntax error at byte offset %d: %v", syntaxErr.Offset, syntaxErr)
}
return err
}
return nil
}
encoding/json库提供了全面的JSON处理功能,从简单的数据转换到复杂的流式处理,能够满足大多数应用场景的需求。通过结构体标签、自定义序列化和合理的错误处理,可以构建健壮且灵活的JSON处理逻辑。
BbS.okacop020.info/PoSt/1120_835200.HtM
BbS.okacop021.info/PoSt/1120_600264.HtM
BbS.okacop022.info/PoSt/1120_239628.HtM
BbS.okacop023.info/PoSt/1120_715382.HtM
BbS.okacop024.info/PoSt/1120_467816.HtM
BbS.okacop025.info/PoSt/1120_606286.HtM
BbS.okacop026.info/PoSt/1120_213131.HtM
BbS.okacop027.info/PoSt/1120_023132.HtM
BbS.okacop028.info/PoSt/1120_602963.HtM
BbS.okacop029.info/PoSt/1120_464166.HtM
BbS.okacop020.info/PoSt/1120_086321.HtM
BbS.okacop021.info/PoSt/1120_236377.HtM
BbS.okacop022.info/PoSt/1120_948952.HtM
BbS.okacop023.info/PoSt/1120_090448.HtM
BbS.okacop024.info/PoSt/1120_288656.HtM
BbS.okacop025.info/PoSt/1120_598406.HtM
BbS.okacop026.info/PoSt/1120_294639.HtM
BbS.okacop027.info/PoSt/1120_066136.HtM
BbS.okacop028.info/PoSt/1120_249193.HtM
BbS.okacop029.info/PoSt/1120_561945.HtM
BbS.okacop020.info/PoSt/1120_141615.HtM
BbS.okacop021.info/PoSt/1120_988738.HtM
BbS.okacop022.info/PoSt/1120_397553.HtM
BbS.okacop023.info/PoSt/1120_244079.HtM
BbS.okacop024.info/PoSt/1120_970117.HtM
BbS.okacop025.info/PoSt/1120_952268.HtM
BbS.okacop026.info/PoSt/1120_127240.HtM
BbS.okacop027.info/PoSt/1120_536642.HtM
BbS.okacop028.info/PoSt/1120_820180.HtM
BbS.okacop029.info/PoSt/1120_816909.HtM
BbS.okacop020.info/PoSt/1120_030469.HtM
BbS.okacop021.info/PoSt/1120_710656.HtM
BbS.okacop022.info/PoSt/1120_191722.HtM
BbS.okacop023.info/PoSt/1120_103536.HtM
BbS.okacop024.info/PoSt/1120_035855.HtM
BbS.okacop025.info/PoSt/1120_103006.HtM
BbS.okacop026.info/PoSt/1120_106084.HtM
BbS.okacop027.info/PoSt/1120_395823.HtM
BbS.okacop028.info/PoSt/1120_363456.HtM
BbS.okacop029.info/PoSt/1120_631776.HtM
BbS.okacop020.info/PoSt/1120_289714.HtM
BbS.okacop021.info/PoSt/1120_436429.HtM
BbS.okacop022.info/PoSt/1120_484086.HtM
BbS.okacop023.info/PoSt/1120_859576.HtM
BbS.okacop024.info/PoSt/1120_181499.HtM
BbS.okacop025.info/PoSt/1120_375351.HtM
BbS.okacop026.info/PoSt/1120_568300.HtM
BbS.okacop027.info/PoSt/1120_809672.HtM
BbS.okacop028.info/PoSt/1120_624621.HtM
BbS.okacop029.info/PoSt/1120_929259.HtM
BbS.okacop020.info/PoSt/1120_887696.HtM
BbS.okacop021.info/PoSt/1120_181320.HtM
BbS.okacop022.info/PoSt/1120_308923.HtM
BbS.okacop023.info/PoSt/1120_282538.HtM
BbS.okacop024.info/PoSt/1120_471157.HtM
BbS.okacop025.info/PoSt/1120_943553.HtM
BbS.okacop026.info/PoSt/1120_441178.HtM
BbS.okacop027.info/PoSt/1120_147771.HtM
BbS.okacop028.info/PoSt/1120_799236.HtM
BbS.okacop029.info/PoSt/1120_967981.HtM
BbS.okacop020.info/PoSt/1120_563129.HtM
BbS.okacop021.info/PoSt/1120_674972.HtM
BbS.okacop022.info/PoSt/1120_820364.HtM
BbS.okacop023.info/PoSt/1120_742953.HtM
BbS.okacop024.info/PoSt/1120_340846.HtM
BbS.okacop025.info/PoSt/1120_031981.HtM
BbS.okacop026.info/PoSt/1120_023408.HtM
BbS.okacop027.info/PoSt/1120_654684.HtM
BbS.okacop028.info/PoSt/1120_721988.HtM
BbS.okacop029.info/PoSt/1120_898458.HtM
BbS.okacop030.info/PoSt/1120_883959.HtM
BbS.okacop031.info/PoSt/1120_445583.HtM
BbS.okacop032.info/PoSt/1120_954695.HtM
BbS.okacop033.info/PoSt/1120_317807.HtM
BbS.okacop034.info/PoSt/1120_178843.HtM
BbS.okacop035.info/PoSt/1120_760034.HtM
BbS.okacop036.info/PoSt/1120_360510.HtM
BbS.okacop037.info/PoSt/1120_261783.HtM
BbS.okacop038.info/PoSt/1120_605807.HtM
BbS.okacop039.info/PoSt/1120_809590.HtM
查看11道真题和解析