json 处理的例子代码, 解析结果看后面注释。

 

package main

import "encoding/json"
import "fmt"
import "os"

type Response1 struct {
    Page   int
    Fruits []string
}

type Response2 struct {
    Page   int      `json:"page"`
    Fruits []string `json:"fruits"`
}

type CommonArg struct {
    SessionId int64  `json:",string"`
    Op        string `json:"Op,omitempty"`
    AppId     string `json:"appId,omitempty"`
    Online    bool
}

func main() {
    bolB, _ := json.Marshal(true)
    fmt.Println(string(bolB)) // true

    intB, _ := json.Marshal(1)
    fmt.Println(string(intB)) // 1

    fltB, _ := json.Marshal(2.34)
    fmt.Println(string(fltB)) // 2.34

    strB, _ := json.Marshal("gopher")
    fmt.Println(string(strB)) // "gopher"

    slcD := []string{"apple", "peach", "pear"}
    slcB, _ := json.Marshal(slcD)
    fmt.Println(string(slcB)) //  ["apple","peach","pear"]

    mapD := map[string]int{"apple": 5, "lettuce": 7}
    mapB, _ := json.Marshal(mapD)
    fmt.Println(string(mapB)) // {"apple":5,"lettuce":7}

    res1D := &Response1{
        Page:   1,
        Fruits: []string{"apple", "peach", "pear"}}
    res1B, _ := json.Marshal(res1D)
    fmt.Println(string(res1B)) // {"Page":1,"Fruits":["apple","peach","pear"]}

    res2D := &Response2{
        Page:   1,
        Fruits: []string{"apple", "peach", "pear"}}
    res2B, _ := json.Marshal(res2D)
    fmt.Println(string(res2B)) // {"Page":1,"Fruits":["apple","peach","pear"]}

    aaa := &CommonArg{
        SessionId: 12345,
        Op:        "werdfsdde22233",
        AppId:     "654343dfddd33424dd",
        Online:    false,
    }
    aaa1, _ := json.Marshal(aaa)
    fmt.Println(string(aaa1)) // {"SessionId":"12345","Op":"werdfsdde22233","appId":"654343dfddd33424dd","Online":false}

    byt := []byte(`{"num":6.0,"strs":["a","b"]}`)

    var dat map[string]interface{}

    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }
    fmt.Println(dat) // map[strs:[a b] num:6]

    num := dat["num"].(float64)
    fmt.Println(num) // 6

    strs := dat["strs"].([]interface{})
    str1 := strs[0].(string)
    fmt.Println(str1) // a

    str := `{"page": 1, "fruits": ["apple", "peach"]}`
    res := &Response2{}
    json.Unmarshal([]byte(str), &res)
    fmt.Println(res)           // &{1 [apple peach]}
    fmt.Println(res.Fruits[0]) // apple

    enc := json.NewEncoder(os.Stdout)
    d := map[string]int{"apple": 5, "lettuce": 7}
    enc.Encode(d) // {"apple":5,"lettuce":7}
}

 

注意,这里 json的 struct field's tag 规范定义如下:

在Go语言里,StructTag是一个标记字符串,此字符串可跟随在Struct中字段定义的后面。

StructTag就是一系列的 key:”value” 形式的组合,其中key是一个不可为空的字符串,key-value组合可以有多个,空格分隔。

StructTag有什么用?!StructTag主要解决了不同类型数据集合间(Struct,Json,Table等)转换中键值Key定义不一样的问题。StructTag可以理解为一个不同数据类型键值Key的映射表Map, 在StructTag中可以定义不同数据集合键值和Struct中Key值的映射关系,这样方便了Struct数据转为其他类型数据的过程。

在StructTag中加入”omitempty”, 标识该字段的数据可忽略。

- 指定到一个field时,无论有没有值将Person序列化成json时都会忽略该字段

参考下面代码, 代码来自:http://studygolang.com/articles/1698

 

package main

import (
    "encoding/json"
    "fmt"
)

//tag中的第一个参数是用来指定别名
//比如Name 指定别名为 username `json:"username"`
//如果不想指定别名但是想指定其他参数用逗号来分隔
//omitempty 指定到一个field时 如果在赋值时对该属性赋值 或者 对该属性赋值为 zero value
//那么将Person序列化成json时会忽略该字段
//- 指定到一个field时
//无论有没有值将Person序列化成json时都会忽略该字段
//string 指定到一个field时
//比如Person中的Count为int类型 如果没有任何指定在序列化
//到json之后也是int 比如这个样子 "Count":0
//但是如果指定了string之后序列化之后也是string类型的
//那么就是这个样子"Count":"0"
type Person struct {
    Name        string `json:"username"`
    Age         int
    Gender      bool `json:",omitempty"`
    Profile     string
    OmitContent string `json:"-"`
    Count       int    `json:",string"`
}

func main() {

    var p *Person = &Person{
        Name:        "brainwu",
        Age:         21,
        Gender:      true,
        Profile:     "I am ghj1976",
        OmitContent: "OmitConent",
    }
    if bs, err := json.Marshal(&p); err != nil {
        panic(err)
    } else {
        //result --> {"username":"brainwu","Age":21,"Gender":true,"Profile":"I am ghj1976","Count":"0"}
        fmt.Println(string(bs))
    }

    var p2 *Person = &Person{
        Name:        "brainwu",
        Age:         21,
        Profile:     "I am ghj1976",
        OmitContent: "OmitConent",
    }
    if bs, err := json.Marshal(&p2); err != nil {
        panic(err)
    } else {
        //result --> {"username":"brainwu","Age":21,"Profile":"I am ghj1976","Count":"0"}
        fmt.Println(string(bs))
    }

    // slice 序列化为json
    var aStr []string = []string{"Go", "Java", "Python", "Android"}
    if bs, err := json.Marshal(aStr); err != nil {
        panic(err)
    } else {
        //result --> ["Go","Java","Python","Android"]
        fmt.Println(string(bs))
    }

    //map 序列化为json
    var m map[string]string = make(map[string]string)
    m["Go"] = "No.1"
    m["Java"] = "No.2"
    m["C"] = "No.3"
    if bs, err := json.Marshal(m); err != nil {
        panic(err)
    } else {
        //result --> {"C":"No.3","Go":"No.1","Java":"No.2"}
        fmt.Println(string(bs))
    }
}

 

参考:

GO语言中的StructTag类型
http://www.wangwei.info/2013/11/golang-struct-tag/

golang json 处理的一些例子代码的更多相关文章

  1. JavaBean到JSon格式的转换例子的代码

    内容过程,把做工程过程较好的内容片段备份一次,如下的内容是关于 JavaBean到JSon格式的转换例子的内容,应该对各朋友有一些用处. User u = new User(); u.setId(1) ...

  2. Golang, 以 9 个简短代码片段,弄懂 defer 的使用特点

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  3. Golang Json文件解析为结构体工具-json2go

    代码地址如下:http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出到 ...

  4. python语言(三)文件修改、函数、json操作、监控日志代码、高效读取文件

    1.文件操作(2)   代码 f = open('a.txt','a') # "a" 如果源文件不在,会自动创建 f.write('abc') result = f.read() ...

  5. Golang ---json解析

    golang官方为我们提供了标准的json解析库–encoding/json,大部分情况下,使用它已经够用了.不过这个解析包有个很大的问题–性能.它不够快,如果我们开发高性能.高并发的网络服务就无法满 ...

  6. VisualStudio2012轻松把JSON数据转换到POCO的代码

    原文:VisualStudio2012轻松把JSON数据转换到POCO的代码       在Visual Studio 2012中轻松把JSON数据转换到POCO的代码,首先你需要安装Web Esse ...

  7. <<精通iOS开发>>第14章例子代码彻底清除警告

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们解决了<<精通iOS开发>> ...

  8. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  9. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

随机推荐

  1. BZOJ4012 [HNOI2015]开店 (动态点分治)

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  2. 操作mysql的指令

    1,通过ip,端口,用户名,密码登陆数据 命令格式为:mysql -h ip -u root -p -P 3306例如:mysql -h 127.0.0.1 -u root -p -P 3306 2, ...

  3. Groovy学习记录-------Groovy安装/配置

    1.Groovy SDK下载 Groovy SDK官网下载地址: http://www.groovy-lang.org/download.html  每个版本有五个选项可供下载,依次为: binary ...

  4. leetcode 198 打家劫舍 Python 动态规划

    打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...

  5. 分布问题(二元,多元变量分布,Beta,Dir)

    这涉及到数学的概率问题. 二元变量分布:       伯努利分布,就是0-1分布(比如一次抛硬币,正面朝上概率) 那么一次抛硬币的概率分布如下: 假设训练数据如下: 那么根据最大似然估计(MLE),我 ...

  6. follow up2-20190426

    406. Minimum Size Subarray 同向双指针 https://www.lintcode.com/problem/minimum-size-subarray-sum/descript ...

  7. CentOS 7 主机名bogon解决办法

    转https://blog.csdn.net/qq_24221531/article/details/80334942 一.修改linux主机的配置文件/etc/hostname 和 /etc/hos ...

  8. 使用NHibernate(1)--资料汇总

    NHibernate最新版本是4.0,目前还只是alpha版,没有发布.稳定版本是3.3,项目中用的也是这个版本,所以以后的介绍都是基于这个版本的. 在网上找了一下相关的学习资料,现汇总如下: NHi ...

  9. 【Eclipse】编译使用Makefile的C工程

    创建MakeFile project新建src文件夹,将文件复制到里面.右击makefile,make targets->create->名称填上allmake targets->b ...

  10. SSH使用密钥免密码登录

    使用ssh远程连接服务器,有两种身份校验方式:账号密码和秘钥.使用秘钥的方式理论上更加安全,而且免去了输入密码的步骤,使用起来更方便(尤其对于sftp,scp等). 设置 SSH,打开密钥登录功能 编 ...