golang json基本操作

aside section._1OhGeD · · 1105 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

话不多说,直接上代码:


/*

* @Descripttion:

* @version:

* @Author: weilin

* @Date: 2019-10-20 10:36:52

* @LastEditors: weilin

* @LastEditTime: 2019-10-20 11:02:09

*/

package main

import (

// json包

/**

json的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式。易于人阅读和编写,

同时易于机器解析和生成。json有两种类型的数据,用go语言来描述这两种类型:

map “名称/值”对,用{}标识

slice 也可以说是数组,用[]标识

{

    "Name": "Joe",

    "Age": 18,

}

["apple", "banana", "pear"]

golang如何处理json

golang标准库encoding/json是用来处理json数据的,它有两组函数或者方法来处理json数据。

函数名 输入 输出 描述

Marshal v interface{} []byte, error 编码v成json数据 To Json

Unmarshal []byte, v(指针) error 解码json,储存在v中 From Json

Encode v interface{} error 编码v成json数据 输出到 io.Writer

Decode v (指针) error 解码json, 输入来自io.Reader

*/

"encoding/json"

"fmt"

)

// 定义结构体用来接收json数据

type Users struct {

ID  string `json:"id"`

Name string `json:"name"`

Age  int    `json:"age"`

}

func main() {

//结构体解析成json

user1 := Users{"1", "user1", 22}

/**

使用json key来标识这个结构体中的field,对应编码后json中key值。

omitempty 如果值是false, 0, 空指针,空接口,空数组,空切片,空映射,空字符串,将被忽略。

“-” 这个field将会被忽略。

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

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

通过结构体生成json,结构体属性字段名首字母要大写

*/

s, err := json.Marshal(user1)

if err != nil {

fmt.Println(err)

} else {

fmt.Println("struct to json---", string(s))

}

//json解析到结构体

var user2 Users

/**

解码函数: func Unmarshal(data []byte, v interface{}) error

data 是一个JSON数据

v 是存储解码数据的指针

error 返回的错误类型

各类型解码

指针:

null解码成空指针

指针非空,解码成指针指向的数据

指针为空,解码函数为他创建新指针,并且为其填充数据。

接口:

UnmarshalJSON method

UnmarshlText method

结构体:

field(tags)相对应解码

碰到不匹配field,忽略掉(默认行为)

切片:

reset slice length to 0, 添加元素到slice

空的JSON 数组,重新生成一个空slice

数组:

go数组小于JSON数组,多余的将忽略

go数组大于JSON数组,多余填充0值

映射:

映射为nil, 重新生成map,填充数据返回

映射非空,直接填充数据

下面例子是解析到结构体

*/

err = json.Unmarshal(s, &user2)

if err == nil {

fmt.Println("json to stuct---", user2)

}

//map解析成json

/**

将map解析成json格式,如果map vaule值为空,则对应json转换后字段值为""

*/

m := make(map[string]interface{}, 2)

m["id"] = "a"

m["name"] = "bb"

m["addr"] = ""

var data []byte

if data, err = json.Marshal(m); err == nil {

fmt.Println("map to json ----", string(data))

}

//json解析成map

/**

映射:

映射为nil, 重新生成map,填充数据返回

映射非空,直接填充数据如

{"addr":"","id":"a","name":"bb"} to map[addr: id:a name:bb]

*/

if err = json.Unmarshal(data, &m); err == nil {

fmt.Println("json to map ----", m)

}

}

/**

参考链接:

https://segmentfault.com/a/1190000018976752

https://www.cnblogs.com/lemonzwt/p/10024009.html

https://my.oschina.net/qiangmzsx/blog/1503018

*/


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:aside section._1OhGeD

查看原文:golang json基本操作

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1105 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传