Golang解析并保存Json

目录

1 解析json

1.1 解析到结构体

解析代码

解析结果

1.2 解析到接口

三方包安装

解析代码

解析结果

2 保存JSON文件

保存代码

输出结果


1 解析json

解析JSON有两种方式:

  1. 解析到结构体,适用于知晓被解析的JSON数据的结构的方案。
  2. 解析到接口,适用于不知道被解析的JSON数据结构的方案。

1.1 解析到结构体

解析代码

​​​​​​​package main
import (
   "encoding/json"
   "fmt"
)
type Server struct {
   ServerName string  // 首字母大写,首字母不敏感,其他字母敏感
   ServerIP   string  // 首字母大写
}
type Serverslice struct {
   Servers []Server
}
func main() {
   var s Serverslice

    //  输入的json字符串
   str := `{"servers":[{"serverName":"Local_Web","serverIP":"127.0.0.1"},{"serverName":"Local_DB","serverIP":"127.0.0.1"}]}`
   json.Unmarshal([]byte(str), &s)
   

    // 输出转换后第一条
    fmt.Println(s.Servers[0])
}

解析结果

{Local_Web 127.0.0.1}

ps:

  • struct中字段首字母需要大写
  • 不想解析全部json字段时,只需要定义部分字段即可

1.2 解析到接口

Golang语言中interface{}可以用来存储任意数据类型的对象,这种数据结构正好可以存储解析的未知结构的JSON数据的结果。

JSON包采用map[string]interface{}和interface{}结构来存储任意的JSON对象和数组。

Go语言类型和JSON类型存在映射关系如下:

  • bool<->JSONbooleans
  • float64<->JSON numbers
  • string<-> JSON strings
  • nil<->JSON null

下面的代码中使用Bitly公司开源的simplejson包,在处理未知结构体JSON比官方包更方便。

三方包安装

方式1 gopath下安装,对应的src中可以引用

运行以下指令即可

go get github.com/bitly/go-simplejson

## 如果返回以下错误,应该是国内无法访问 golang.org。


go get: module github.com/bitly/go-simplejson: Get "https://proxy.golang.org/github.com/bitly/go-simplejson/@v/list": dial tcp 172.217.163.49:443: connectex: A conne
ction attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed 
to respond.

使用国内七牛云的 go module 镜像。

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

go get github.com/bitly/go-simplejson

接下来的步骤请看:

go项目版本管理-引入第三方包_风间净琉璃的博客-CSDN博客

解析代码

package main

import (
	"fmt"
	"github.com/bitly/go-simplejson"
)

func main() {
	fmt.Println("dd")

	json, err := simplejson.NewJson([]byte(`{
			"test":{
				"array" :[1,"2",3],
				"int": 10,
				"float":5.150,
				"bignum":9223372036854775807,
				"string":"simplejson",
				"bool":true
			}
	}`))

	array, err := json.Get("test").Get("array").Array()

	i, err := json.Get("test").Get("int").Int()

	mustString := json.Get("test").Get("string").MustString()

	fmt.Println(array)
	fmt.Println(err)
	fmt.Println(i)
	fmt.Println(mustString)

}

解析结果

2 保存JSON文件

2.1 保存代码

package main

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

type Server struct {
	ServerName string
	ServerIP   string
}

type Serverslice struct {
	Servers []Server
}

func main() {
	var s Serverslice

	s.Servers = append(s.Servers, Server{ServerName: "Local_Web", ServerIP: "127.0.0.1"})
	s.Servers = append(s.Servers, Server{ServerName: "Local_Db", ServerIP: "127.0.0.1"})

	marshal, err := json.Marshal(s)
	if err != nil {
		fmt.Println("json error:", err)
		return
	}

	create, err := os.Create("server.json")
	if err != nil {
		fmt.Println("cretre error", err)
		return
	}

	_, err = create.Write(marshal)
	if err != nil {
		fmt.Println("write error", err)
		return
	}

	// 用后关闭
	defer create.Close()
	fmt.Println(string(marshal))

}

2.2 输出结果

可以根据保存文件到指定的路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值