当前位置: 首页 > article >正文

go中常用的处理json的库

在 Go 的标准库中,encoding/json 包提供了多种函数用于处理 JSON 数据。以下是一些常用的函数和它们的用途:

1. json.Marshal

  • 用途: 将 Go 值编码为 JSON 格式的字节切片。
  • 签名:
    func Marshal(v interface{}) ([]byte, error)
    
  • 参数: v 是要编码的 Go 值,通常是一个结构体、数组、切片、映射等。
  • 返回值: 返回编码后的字节切片和可能出现的错误。

示例:

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	p := Person{Name: "John", Age: 30}
	data, err := json.Marshal(p)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(string(data)) // 输出: {"name":"John","age":30}
}

2. json.Unmarshal

  • 用途: 将 JSON 数据解码为 Go 类型。
  • 签名:
    func Unmarshal(data []byte, v interface{}) error
    
  • 参数:
    • data 是要解码的 JSON 数据的字节切片。
    • v 是目标 Go 类型的指针,通常是一个结构体或切片。
  • 返回值: 返回解码过程中可能发生的错误。

示例:

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	data := []byte(`{"name":"Alice","age":25}`)
	var p Person
	err := json.Unmarshal(data, &p)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(p) // 输出: {Alice 25}
}

3. json.NewEncoder

  • 用途: 返回一个新的 json.Encoder,可以用于将 Go 值直接编码为 JSON,并写入到 io.Writer
  • 签名:
    func NewEncoder(w io.Writer) *Encoder
    
  • 参数: w 是一个 io.Writer,可以是文件、网络连接或标准输出等。
  • 返回值: 返回一个新的 json.Encoder

示例:

package main

import (
	"encoding/json"
	"fmt"
	"os"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	p := Person{Name: "Bob", Age: 40}
	encoder := json.NewEncoder(os.Stdout)
	err := encoder.Encode(p)
	if err != nil {
		fmt.Println("Error:", err)
	}
}

4. json.NewDecoder

  • 用途: 返回一个新的 json.Decoder,可以用于从 io.Reader 中读取 JSON 数据并解码为 Go 值。
  • 签名:
    func NewDecoder(r io.Reader) *Decoder
    
  • 参数: r 是一个 io.Reader,可以是文件、网络连接或标准输入等。
  • 返回值: 返回一个新的 json.Decoder

示例:

package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	data := `{"name":"Eve","age":22}`
	decoder := json.NewDecoder(strings.NewReader(data))
	var p Person
	err := decoder.Decode(&p)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(p) // 输出: {Eve 22}
}

5. json.Indent

  • 用途: 格式化 JSON 字节切片,使其更具可读性(添加缩进)。
  • 签名:
    func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
    
  • 参数:
    • dst 是输出的缓冲区(通常是 *bytes.Buffer)。
    • src 是待格式化的 JSON 数据。
    • prefix 是每行的前缀。
    • indent 是每一层嵌套的缩进字符。
  • 返回值: 返回格式化过程中可能发生的错误。

示例:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

func main() {
	data := []byte(`{"name":"Charlie","age":30}`)
	var out bytes.Buffer
	err := json.Indent(&out, data, "", "  ")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(out.String())
}

输出:

{
  "name": "Charlie",
  "age": 30
}

6. json.RawMessage

  • 用途: 用于延迟 JSON 解码,或在不解码的情况下持有原始的 JSON 数据。
  • 类型:
    type RawMessage []byte
    
  • 用法: 通过 RawMessage 类型,你可以将 JSON 数据存储为原始的字节切片,稍后再解码或直接传递给其他函数。

示例:

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name    string          `json:"name"`
	Age     int             `json:"age"`
	Details json.RawMessage `json:"details"`
}

func main() {
	data := []byte(`{"name":"John","age":25,"details":{"city":"New York"}}`)
	var p Person
	err := json.Unmarshal(data, &p)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Name:", p.Name)         // 输出: Name: John
	fmt.Println("Age:", p.Age)           // 输出: Age: 25
	fmt.Println("Details:", string(p.Details)) // 输出: Details: {"city":"New York"}

	// 你可以稍后再处理 "details" 字段
	var details map[string]string
	err = json.Unmarshal(p.Details, &details)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("City:", details["city"]) // 输出: City: New York
}

总结

  • json.Marshal: 将 Go 值编码为 JSON。
  • json.Unmarshal: 将 JSON 解码为 Go 值。
  • json.NewEncoder: 创建一个编码器,直接将 Go 值写入 io.Writer
  • json.NewDecoder: 创建一个解码器,从 io.Reader 读取并解码 JSON。
  • json.Indent: 对 JSON 数据进行格式化,添加缩进。
  • json.RawMessage: 用于存储和处理未解码的 JSON 数据。

这些函数是 Go 处理 JSON 数据时最常用的功能,涵盖了编码、解码、格式化以及延迟解码等常见需求。


http://www.kler.cn/a/448861.html

相关文章:

  • Hmsc包开展群落数据联合物种分布模型分析通用流程(Pipelines)
  • Android 代码模式的理解
  • Java字符串的|分隔符转List实现方案
  • ffmpeg翻页转场动效的安装及使用
  • aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
  • OpenTK 中帧缓存的深度解析与应用实践
  • c++的类中的私有成员变量是否可以在cpp文件中再定义一次
  • Redis篇--常见问题篇2--缓存雪崩(过期时间分散,缓存预热,多级缓存)
  • Docker基础命令实战
  • whisper实时语音转文字
  • Java中使用四叶天动态代理IP构建ip代理池,实现httpClient和Jsoup代理ip爬虫
  • 梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
  • Vue(二)
  • MATLAB绘图基础12:地理信息可视化
  • 1222面经
  • 【Go】Go数据类型详解—指针
  • LeetCode 26. 删除有序数组中的重复项 (C++实现)
  • 工具环境 | 工具准备
  • SSM 架构 Vue 赋能:WEB 开放性实验室智能管理系统
  • harmony UI组件学习(1)
  • 实验13 C语言连接和操作MySQL数据库
  • springboot453工资信息管理系统(论文+源码)_kaic
  • 解决Vmware虚拟机系统镜像无法解析DNS
  • 【Java基础面试题034】Java泛型擦除是什么?
  • 基于大语言模型的多代理下一代制造系统能灵活动态管理制造资源的高效调度方法
  • 一种统计torch内部计算过程算子输入输出信息的方法