GO: json 处理

需要引入"encoding/json"包

json解析到map

jsonStr := "{\"a\":\"test\",\"b\":\"testb\"}"
var dat map[string]string
err := json.Unmarshal([]byte(jsonStr), &dat)
if err == nil {
   fmt.Println(dat)
}

结果:
map[a:test b:testb]

json解析到数组

	jsonStr := "[\"test\",\"testb\"]"
	var dat []string
	err := json.Unmarshal([]byte(jsonStr), &dat)
	if err == nil {
		fmt.Println(dat)
	}


json 解析到结构体

package main

import (
   "encoding/json"
   "fmt"
)

type Person struct {
   //结构也是一种类型
   Name string //定义struct的属性
   Age  int
}

func main() {   
   var person Person
   jsonStr := "{\"Name\":\"test\",\"Age\":19}"
   if err := json.Unmarshal([]byte(jsonStr), &person); err == nil {
      fmt.Println(person)
   }
}
结果:
{test 19}

interface{}

如果不想用结构体,怎么办,如api接收过来的参数,不确定json串里面有什么数据类型,可通过interface{}实现

示例:

package main

import (
   "encoding/json"
   "fmt"
)
func main() {

var data map[string]interface{}
	jsonStr := "{\"Name\":\"test\",\"Age\":19,\"infos\":[{\"info1\":\"hello\"},{\"info2\":\"hello\"}],\"pic\":{\"pic1\":\"img.jpg\"}}"
	err := json.Unmarshal([]byte(jsonStr), &data)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(data)
	for _,value:=range data{
		switch value.(type) {
		case float64:
			fmt.Println(value)
		case string:
			fmt.Println(value)
		case []interface {}:
			for k,v:=range value.([]interface {}){
				fmt.Println(k,v)
			}
		case map[string]interface {}:
			for k,v:=range value.(map[string]interface {}){
				fmt.Println(k,v)
			}
		}
	}
}
输出结果:
map[infos:map[info:hello] Name:test Age:19]

将数组或结构体转成json

package main

import (
   "encoding/json"
   "fmt"
)
func main() { 

   arr := []string{"aaa", "bbb", "ccc"}
   data, err := json.Marshal(arr)
   if err == nil {
      //data是[]byte类型,转化成string类型便于查看
      fmt.Println(string(data))
   }
}

小结:

1、用interface{}需要注意, JSON 里的数字默认都会转成 Golang 的 float64 类型,字符是string,使用方式为

fmt.Println(data["Name"].(string))
fmt.Println(data["Age"].(float64))

float64转其他类型,可参考:类型转换

2、golang 里json不是字符串而是 []byte类型,如果想用字符串可以用string()转。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易风有点疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值