添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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!
                            
python中两个方括号内代表什么 python两个加号

Python-2.2-运算符运算符算术运算符比较运算符赋值运算符逻辑运算符成员运算符身份运算符运算符优先级问题 运算符由一个以上的值经过一系列的运算得到新值的过程就叫运算用来操作运算的符号叫运算符运算符分类 算术运算符比较或者关系运算符赋值运算符逻辑运算符号位运算(二进制)成员运算符身份运算符表达式 由一个或几个数字或者变量或者运算符合成第一行代码通常返回一个结果#表达式案例