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这样子的错误,这是由于苹果的安全机制导致需 ...
随机推荐
- Web API POST [FromBody] string value 接受参数
网上看到很多关于这这个问题的解决方案,但是都不正确,我也恰巧遇到这个问题,所有把正确的解决方案写出来,希望给后来人参考,如有不同意见欢迎指正 namespace WebApi.Controllers ...
- [leetcode] 45. Jump Game II(hard)
原题 题意: 是Jump Game的衍生题(题解),题意求跳到最后一格所需最少步数,(默认所测数据永远可以跳到最后一格). 思路: 利用贪心,遍历数组,记录在每一步可跳跃到的最大区域. 1.当前步数 ...
- [leetcode] 543. Diameter of Binary Tree (easy)
原题 思路: 题目其实就是求左右最长深度的和 class Solution { private: int res = 0; public: int diameterOfBinaryTree(TreeN ...
- 四、利用SQL Server 2008 R2创建自动备份计划
(转) 本文主要利用SQL Server 2008 R2自带的"维护计划"创建一个自动备份数据的任务. 首先,启动 Sql Management studio,确保"SQ ...
- liunx基本操作操作与文件和目录的管理
一.基本操作 Tab键: 自动补全ctrl + u: 清空至行首ctrl + k: 清空至行尾 ctrl + l: 清屏 ctrl + c: 取消本次命令编辑重启:rebootsystemctl re ...
- ThreadPoolExecutor带来的性能问题
使用线程池,一般情况下会带来性能提升,并且使用线程池管理线程,减少了每个任务调用的开销,通常可以在执行大量异步任务时提供增强的性能. 但是在高并发的情况下,会因为使用不当导致性能下降,并且下降得比较严 ...
- vue.js带复选框表单的增删改查
近段时间由于公司项目要求,前端开始使用VUE框架进行开发,最近刚开始学习,做了一个表单的增删改查,和大家分享一下. 页面模型代码设计如下 <template> <div id=&qu ...
- TreeSet类的排序
TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系, ...
- bean的创建(五)第四部分 bean构造器的查找
前面分析了bean的静态工厂查找 bean的构造器查找过程和bean的静态工厂查找类似 protected BeanWrapper createBeanInstance(String beanName ...
- js里的window对象
alert(<msg>) 向用户显示对话框窗口并等候其被关闭 blur() 让窗口失去键盘焦 ...