/**
* @Author: jadeshu
* @Description:
* @File: main
* @Version: 1.0.0
* @Date: 2019/11/7 2:33
*/
package main import (
"encoding/json"
"fmt"
) // 输出json 结构体中字段首字母必须大写
type person struct {
//tag JSON中头字母变小写
Name string `json:"name"`
Age int `json:"age"` add int
// tag 此字段bool类型转换为字符串输出
Sex bool `json:",string"`
// tag 此字段不会显示输出
Sub []string `json:"-"`
} func main() {
p := person{"jadeshu", 1, 20, false, []string{"type1", "type2", "type3"}} //bytes, e := json.Marshal(p)
// 格式化输出 方便查看
bytes, e := json.MarshalIndent(p, "", " ")
if e != nil {
fmt.Println(e.Error())
return
}
fmt.Println(string(bytes))
// end // ========通过map生成json文件
// key:string val:任意类型
m := make(map[string]interface{}, 10)
m["name"] = "jadeshu"
m["age"] = 12
m["type"] = [3]string{"type1", "type2", "type3"} // 编码成JSON
marshal, e := json.Marshal(m)
if e != nil {
fmt.Println(e.Error())
return
} fmt.Println(string(marshal))
// end // JSON解析到结构体中
jbuf := `{
"first_name":"John",
"last_name":"Doe",
"age":20
}` type pName struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Age int `json:"age"`
}
var p1 pName
json.Unmarshal([]byte(jbuf), &p1)
fmt.Println(p1)
// end // 只想读取JSON文件中的一个字段
type pNamePart struct {
LastName string `json:"last_name"`
} var pPart pNamePart
// 第二参数必须是指针
json.Unmarshal([]byte(jbuf), &pPart) //传地址
fmt.Println(pPart)
// end // JSON解析到map中
jmap := make(map[string]interface{}, 10)
json.Unmarshal([]byte(jbuf), &jmap) //传地址
fmt.Println(jmap)
// end // 类型断言 判断
for key, val := range jmap {
switch data := val.(type) {
case string:
fmt.Println("读取到字符串:", key, "--", data)
case int:
fmt.Println("读取到整数型:", key, "--", data)
case float64:
// 读取json转换为MAP后,整数变为浮点数
fmt.Println("读取到float64型:", key, "--", data)
}
}
}

运行结果:

{
"name": "jadeshu",
"age": 1,
"Sex": "false"
}
{"age":12,"name":"jadeshu","type":["type1","type2","type3"]}
{John Doe 20}
{Doe}
map[age:20 first_name:John last_name:Doe]
读取到字符串: first_name -- John
读取到字符串: last_name -- Doe
读取到float32型: age -- 20

所有JSON数值类型一律解析为float64类型,需手动转换;对于map类型需判断是否为nil再转换为所需类型。

interface{}类型在json.Unmarshal时,会自动将JSON转换为对应的数据类型:

JSON的boolean 转换为bool

JSON的数值 转换为float64

JSON的字符串 转换为string

JSON的Array 转换为[]interface{}

JSON的Object 转换为map[string]interface{},也可以转为本身类型

JSON的null 转换为nil

Go-Json操作的更多相关文章

  1. Json操作(DynamicJson)

    Json的简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了 ...

  2. ASP.NET 里的 JSON操作

    最近项目中需要用到 JSON操作,google了一下 找到了几个比较好的操作方法.... 一 .使用 mircosoft 提供的 .NET Framework 自带的 json操作方法 1. 使用Ja ...

  3. Newtonsoft.Json 操作 JSON 字符串

    Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSeriali ...

  4. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  5. JavaScript对json操作小记

    JSON是一种轻量级的数据交换格式,同时,JSON是 JavaScript 原生格式,因此我们可以直接处理它不需要依赖任何工具包或者插件.因此,好多后台都会选择返回给前端这种非常友好的数据格式. 引子 ...

  6. 微信小程序setData()方法的详解以及对数组/json操作

    此篇文章是本人对setData方法的一些理解,是查阅文档和查找一些其他资料综述的,有所不足希望指正! 直接进入正题! 一.setData()方法: 1.参数接受一个对象,以key,value的形式表示 ...

  7. C#工具类:Json操作帮助类(转载)

    原文转载自C#工具类:Json操作帮助类_IT技术小趣屋. Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来 ...

  8. 【转载】C#工具类:Json操作帮助类

    Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来简化相应的操作,该工具类中包含以下功能:对象转JSON.数据 ...

  9. 【转】python 历险记(四)— python 中常用的 json 操作

    [转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...

  10. python 历险记(四)— python 中常用的 json 操作

    目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...

随机推荐

  1. python 基础(集合)

    #set里的元素是唯一的,即没有重复的,可以用set()函数,去数据的重复冗余 L = [1,1,1,2,4,5,6,7] S = set(L) print(S) #打印结果{1, 2, 4, 5, ...

  2. Workerman简单开发示例实践(一)

    一.去官网下载workerman,地址:https://www.workerman.net/download,下载后解压任意文件夹. 二.在解压文件目录下新建http_test.php,输入如下代码: ...

  3. Celery:routing

    参考:http://docs.celeryproject.org/en/latest/userguide/routing.html#guide-routing

  4. Web开发基础知识

    综述 最近开始Java Web方面的工作,千里之行始于足下,我们在开发过程中要善于总结自己遇到的问题.善于管理一些优秀的代码片段.本文的主要内容是Web开发的基础知识,对于大牛来说可以忽略,对于初入W ...

  5. 【数据泵】EXPDP导出表结构

    [数据泵]EXPDP导出表结构(真实案例) BLOG文档结构图         因工作需要现需要把一个生产库下的元数据(表定义,索引定义,函数定义,包定义,存储过程)导出到测试库上,本来以为很简单的, ...

  6. Linux 服务控制与运行级别

    如何控制服务的运行状态?如何切换不同的运行级别? 服务控制 ntsysv 仿图形交互界面,集中配置各种服务启动状态 --level 35:同时对指定运行级别中的服务进行管理,不加仅管理当前运行级别中的 ...

  7. linux备份mysql文件并恢复的脚本,以及其中出现的错误:ERROR: ASCII '\0' appeared in the statement

    首先是在网上找了一下教程,代码很简单 #!/bin/bash folder=~/test time=`date +%Y%m%d` mysqldump -u user -p pwd -hlocalhos ...

  8. tree - 列出树状目录结构

    tree - list contents of directories in a tree-like format. 树状显示目录结构 常用格式: tree [option] [directory] ...

  9. SQL与NoSQL区别--商业SQL数据库衰落--oracle面临困境

    转自:商用数据库之死:Oracle 面临困境 这二十年来,商业数据库市场仍然是 IT 行业最稳定.最具黏性的领域之一,Oracle.IBM 和微软三家厂商瓜分了 80% 的份额.然而,我们认为这个领域 ...

  10. Mac Docker安装MySQL5.7

    mkdir mysql 在~目录下创建mysql目录 docker run --restart=always --name mysql5.7 -p 3306:3306 -v ~/mysql:/var/ ...