Go-json解码到接口及根据键获取值
Go-json解码到接口及根据键获取值
package main
import (
"encoding/json"
"fmt"
"github.com/bitly/go-simplejson"
)
type JsonServer struct {
ServerName string
ServerIP string
}
type JsonServers struct {
Servers []JsonServer
}
func main() {
var s JsonServers
str := `{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"127.0.0.2"}]}`
json.Unmarshal([]byte(str), &s)
fmt.Println(s) //{[{Shanghai_VPN 127.0.0.1} {Beijing_VPN 127.0.0.2}]}
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`)
var f interface{}
json.Unmarshal(b, &f)
fmt.Printf("%+v\n", f) // map[Name:Wednesday Age:6 Parents:[Gomez Morticia]]
m := f.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv) //Name is string Wednesday
case int:
fmt.Println(k, "is int", vv)
case float64:
fmt.Println(k, "is float64", vv) //Age is float64 6
case []interface{}:
fmt.Println(k, "is an array:") //Parents is an array:
//0 Gomez
//1 Morticia
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
/**
如您所见,我们现在可以通过interface{}解析未知格式的JSON并键入断言。
以上示例是官方解决方案,但类型断言并不总是方便。
因此,我推荐一个名为simplejson的开源项目,由bitly创建和维护。
以下是如何使用此项目处理未知格式的JSON的示例:
go get ithub.com/bitly/go-simplejson
*/
// 根据键获取值
js, err := simplejson.NewJson([]byte(`{
"test": {
"array": [1, "2", 3],
"int": 10,
"float": 5.150,
"bignum": 9223372036854775807,
"string": "simplejson",
"bool": true
}
}`))
if err != nil {
fmt.Println("err:", err)
}
arr, _ := js.Get("test").Get("array").Array() //arr: [1 2 3]
fmt.Println("arr:", arr)
i, _ := js.Get("test").Get("int").Int() //i: 10
fmt.Println("i:", i)
ms := js.Get("test").Get("string").MustString() //ms: simplejson
fmt.Println("ms:", ms)
}
json解码到接口
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonBuf := `
{
"company": "itcast",
"subjects": [
"Go",
"C++",
"Python",
"Test"
],
"isok": true,
"price": 666.666
}
`
//创建一个map
m := make(map[string]interface{}, 4)
err := json.Unmarshal([]byte(jsonBuf), &m)
if err != nil {
fmt.Println("err=", err)
return
}
fmt.Println("m=", m) //m= map[company:itcast subjects:[Go C++ Python Test] isok:true price:666.666]
fmt.Printf("m=%+v\n", m) //m=map[isok:true price:666.666 company:itcast subjects:[Go C++ Python Test]]
var s string
s = m["company"].(string)
fmt.Println("s= ", s) //s= itcast
var s1 bool
s1 = m["isok"].(bool)
fmt.Println("s1= ", s1) //s1= true
var s2 float64
s2 = m["price"].(float64)
fmt.Println("s2= ", s2) //s2= 666.666
var str string
//类型断言
for key, value := range m {
// fmt.Printf("%v===>%v\n", key, value)
switch data := value.(type) {
case string:
str = data
fmt.Printf("map[%s]的值类型为string,内容为%s\n", key, str)
case bool:
fmt.Printf("map[%s]的值类型为bool,内容为%v\n", key, data)
case float64:
fmt.Printf("map[%s]的值类型为float64,内容为%v\n", key, data)
case []string:
fmt.Printf("map[%s]的值类型为[]stiring1,内容为%v\n", key, data)
case []interface{}:
fmt.Printf("map[%s]的值类型为[]stiring2,内容为%v\n", key, data)
}
/*
map[company]的值类型为string,内容为itcast
map[subjects]的值类型为[]stiring2,内容为[Go C++ Python Test]
map[isok]的值类型为bool,内容为true
map[price]的值类型为float64,内容为666.666
*/
}
}
Go-json解码到接口及根据键获取值的更多相关文章
- js循环json得到 键和值
var jsondata=[{"男":4,"女":3,"不详":0},{"男one":23,"女two&quo ...
- requests(二): json请求中固定键名顺序&消除键和值之间的空格
继上一篇requests发送json请求的文章后,实际工作中遇到了以下2种情况. 1:服务端要求json字符串,键名的顺序固定 2.服务端对于接收到的json数据中,若key和value之间有空格, ...
- 通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学
首发于:Aardio通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=429 ...
- 一、json数组的键和值
一.json数组的键和值 https://blog.csdn.net/sinat_30224769/article/details/51702203 string test_json = " ...
- Map接口中的常用方法和Map集合遍历键找值方式
Map接口中定义了很多方法,常用的如下: public V put(K key,V value) 将指定的值与此映射中的指定键相关联(可选操作) V remove(Object key); 如果此映射 ...
- ReadyAPI/soapUI发送post请求json格式(带有中文字符),后台获取参数为空
解决:请求编码格式默认为空,在"TestCase"的指定Step的Request Properties中, 改Encoding编码格式为UTF-8. 原文:soapUI发送post ...
- 运用百度开放平台接口根据ip地址获取位置
使用百度开放平台接口根据ip地址获取位置 今天无意间发现在百度开放平台接口,就把一段代码拿了下来,有需要的可以试试看:http://opendata.baidu.com/api.php?query=5 ...
- Mybatis学习笔记4 - 获取自增主键的值
获取自增主键的值:mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys():useGeneratedKeys="true&qu ...
- 小程序调用wx.chooseLocation接口的时候无法获取权限(ios)
ios手机小程序调用wx.chooseLocation接口的时候,获取权限的时候报authorize:fail:require permission desc这样子的错误,这是由于苹果的安全机制导致需 ...
随机推荐
- ServiceFabric极简文档-3. 发布脚本
web: Trap { Write-Host $_.Exception.Message; Continue }; Connect-ServiceFabricCluster Remove-Service ...
- 比赛:小奔的方案 solution
题目 题目背景 有一个著名的题目: 五个海盗抢到了100个金币,每一颗都一样的大小和价值连城. 他们决定这么分: 1.抽签决定自己的号码 ------ [1.2.3.4.5] 2.首先,由1号提出分配 ...
- Git命令行之快速入门
从头开始创建一个版本库,添加一些内容,然后管理一些修订版本. 有两种建立 Git版本库 的基础技术.第一:从头开始创建,用现有的内容填充它.第二:可以克隆一个已有的版本库.这里选择从一个空的版本库开始 ...
- 小记---idea springboot 报错没有get或者set方法
给idea 安装一个插件即可
- Spark-windows安装
Spark 目的:达到能在pycharm中测试 1.安装必要的文件: JDK AnaConda spark hadoop jdk测试:java -version Anaconda测试: 打开Anaco ...
- 多线程与高并发(五)final关键字
final可以修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,我们先依次学习final的基础用法,然后再研究final关键字在多线程中的语义. 一.变量 变量,可以分为成员变量 ...
- 使用RabbitMQ做数据接收和处理时,自动关闭
场景:N个客户端向MQ里发送数据:服务器上有另一个控制台程序(假设叫ServerClient)来处理这里数据(往数据库保存).方向为Client * n→MQSERVER→ServerClient 问 ...
- 分组在re模块中的使用以及使用正则表达式的技巧
1.split:切割 使用split不会返回被切割的字符 import re ret = re.split("\d+","5as46asf46asf46a") ...
- Java基础之分支结构循环结构
流程控制语句if(分支结构) 流程控制:流程就是指代码运行过程.控制就是说什么场景可以执行,什么场景不能执行. 1.if语句第一种形式 格式:if(表达式){ 执行的语句: } 2. ...
- javascript基础学习第一天
Javascript 发展过程: 1.出现:为了解决用户和游览器之间的交互. 2.概念:基于对象和事件驱动,运行在游览器客户端的脚本语言. -js在游览器中运行的.(js引擎:执行js代码) -事件: ...