Go JSON处理全攻略:编码解码实战

Go基础:JSON文件处理详解(标准库encoding/json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于Web开发和数据传输。Go语言通过标准库encoding/json提供了强大的JSON处理能力,支持序列化(编码)和反序列化(解码)操作。

JSON序列化(编码)

将Go数据结构转换为JSON格式的过程称为序列化。encoding/json提供了MarshalMarshalIndent函数实现这一功能。

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.Decoderjson.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.Marshalerjson.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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务