GO语言开发之JSON处理 编码JSON 与 解码JSON

1. json简介

JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成。尽管JSON是JavaScript的一个子集,但JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文本描述形式(类似一些编程语言中的字典结构),这使它成为较为理想的、跨平台、跨语言的数据交换语言。

开发者可以用 JSON 传输简单的字符串、数字、布尔值,也可以传输一个数组,或者一个更复杂的复合结构。在 Web 开发领域中, JSON被广泛应用于 Web 服务端程序和客户端之间的数据通信。

Go语言内建对JSON的支持。使用Go语言内置的encoding/json 标准库,开发者可以轻松使用Go程序生成和解析JSON格式的数据。

 

JSON官方网站:http://www.json.org/

在线格式化:http://www.json.cn/

 

2. json编码

使用json.Marshal()函数可以对一组数据进行JSON格式的编码。

func Marshal(interface{}) ([]byte, error)

MarshalIndent 很像 Marshal,只是用缩进对输出进行格式化

func MarshalIndent(interface{}, prefix, indent string) ([]byte, error)

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct{
	Name string
	Company string
	Subjects []string
	IsOk bool
	Price float64
}

func main()

	t1 := IT{"Ternence Hsu","Google", []string{"Go", "C++", "Python", "Test"}, true,666.666}

	//生成一段JSON 格式的文本
	//如果编码成功, err 将赋于零值 nil,变量b 将会是一个进行JSON 格式化之后的[]byte 类型
	b1, err := json.Marshal(t1)
	if err != nil {
		fmt.Println("json err:", err)
	}
	
	// 用缩进对输出进行格式化
	b2, err := json.MarshalIndent(t1, "", "    ")
	if err != nil {
		fmt.Println("json err:", err)
	}

	fmt.Println(string(b1))
	fmt.Println(string(b2))
}

	/*
		b1输出结果:
		{"Name":"Ternence Hsu","Company":"Google","Subjects":["Go","C++","Python","Test"],"IsOk":true,"Price":666.666}

		b2 输出结果:
		{
			"Name":"Ternence Hsu",
			"Company":"Google",
			"Subjects":[
				"Go",
				"C++",
				"Python",
				"Test"
			],
			"IsOk":true,
			"Price":666.666
		}
	*/

3. json解码

使用json.Unmarshal()函数将JSON格式的文本解码为Go里面预期的数据结构

func Unmarshal(data []byte, v interface{}) error

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Name  	 string   `json:"name"`
	Company  string   `json:"company"`
	Subjects []string `json:"subjects"`
	IsOk     bool     `json:"isok"`
	Price    float64  `json:"price"`
}
	
func main() {
	b := []byte(`{
	"name": "Ternence Hsu",
	"company": "Google",
	"subjects": [
		"Go",
		"C++",
		"Python",
		"Test"
	],
	"isok": true,
	"price": 666.666
}`)

	var t IT
	err := json.Unmarshal(b, &t)
	if err != nil {
		fmt.Println("json err:", err)
	}
	fmt.Println(t)
	//运行结果:{Ternence Hsu Google [Go C++ Python Test] true 666.666}

	//只想要Subjects字段
	type IT2 struct {
		Subjects []string `json:"subjects"`
	}

	var t2 IT2
	err = json.Unmarshal(b, &t2)
	if err != nil {
		fmt.Println("json err:", err)
	}
	fmt.Println(t2)
	//运行结果:{[Go C++ Python Test]}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值