go的string字符串格式转json格式
确实有点麻烦,如果不知道json里面的类型好像就构建不了结构体了。
package main import ( "encoding/json" "fmt" ) type data struct { status int `json:"status"` msg int `json:"msg"` } func main() { msg := "{\"status\":200, \"msg\":18}" var data data if err := json.unmarshal([]byte(msg), &data); err == nil { fmt.println(data.status) } else { fmt.println(err) } }
针对包含任意层级的 josn 数据,声明结构体类型比较困难
encode\json 包还提供另外一种方法来解析 json 数据。
encoding\json 包使用:
map [string] interface {} 存储 josn 对象 [] interface 存储 josn 数组
json.unmarshl 将会把任何合法的 json 数据存储到一个 interface {} 类型的值,通过使用空接口类型我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言。
示例代码:
jsondata := []byte(`{"name":"eve","age":6,"parents":["alice","bob"]}`) var v interface{} json.unmarshal(jsondata, &v) data := v.(map[string]interface{}) for k, v := range data { switch v := v.(type) { case string: fmt.println(k, v, "(string)") case float64: fmt.println(k, v, "(float64)") case []interface{}: fmt.println(k, "(array):") for i, u := range v { fmt.println(" ", i, u) } default: fmt.println(k, v, "(unknown)") } }
用 decoder 解析数据流
上面都是使用的 unmarshall 解析的 json 数据,如果 json 数据的载体是打开的文件或者 http 请求体这种数据流(他们都是 io.reader 的实现),我们不必把 json 数据读取出来后再去调用 encode/json 包的 unmarshall 方法,包提供的 decode 方法可以完成读取数据流并解析 json 数据最后填充变量的操作。
// this example uses a decoder to decode a stream of distinct json values. func exampledecoder() { const jsonstream = ` {"name": "ed", "text": "knock knock."} {"name": "sam", "text": "who's there?"} {"name": "ed", "text": "go fmt."} {"name": "sam", "text": "go fmt who?"} {"name": "ed", "text": "go fmt yourself!"} ` type message struct { name, text string } dec := json.newdecoder(strings.newreader(jsonstream)) for { var m message if err := dec.decode(&m); err == io.eof { break } else if err != nil { log.fatal(err) } fmt.printf("%s: %s\n", m.name, m.text) } // output: // ed: knock knock. // sam: who's there? // ed: go fmt. // sam: go fmt who? // ed: go fmt yourself! }
到此这篇关于golang string字符串类型转json格式的文章就介绍到这了,更多相关golang string字符串转json内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论