Golang中国

howcrazy

Golang China 第 5895 号会员,加入于 2016-08-14 23:36


howcrazy最近创建的主题


1 在Xorm中,构建相对复杂的查询条件
分享howcrazy • 2016-10-18 14:42 • 最后回复来自 xiaolunwen
一个Golang的类型转换工具
推广howcrazy • 2016-08-15 03:57
howcrazy 创建的更多主题

howcrazy最近回复了


回复了 yxllin 创建的主题: 关于json 的 unmarshal 受主为map[string]interface{} 类型断言的机制问题 2016-09-03 01:47

这是由于JSON里的数字默认都会转成golang的float64类型引起的

进行json解析时,若以interface{}接收数据,则会按照下列规则进行解析:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

而浮点数打印时的默认规则是超过一定长度后会换成科学计数法打印。

因此,只要在打印时指定打印格式,或者(按照LZ示例里是整数的情况时),转换为整数打印

fmt.Println(int(a["id"].(float64)))
回复了 heyishi 创建的主题: json 串解析 为甚要 for 循环 求解 2016-08-17 02:25

这里是从输入流里读取字节流解析,一次解析一个符合要求结构体(v)的输入。
你贴的代码缺少v的类型定义,且输入流只有一段json文本

建议你看下官方文档的示例,会更明晰:

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)
}

如果只有一段json文本,不循环也可以,或者直接用json.Unmarshal

回复了 lonso 创建的主题: golang中,想使用json,是不是每次都必须定义一个struct? 否者怎么实现? 2016-08-15 22:43

可以是可以,当然完全不建议这么做。。。

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    m := map[string]interface{}{}
    bs := []byte(`{"A": 1, "B": "Z", "D": {"E": 2}}`)
    json.Unmarshal(bs, &m)
    fmt.Println(m)
    fmt.Println(m["A"].(float64))
    fmt.Println(m["B"].(string))
    fmt.Println(m["D"].(map[string]interface{}))
    bs, _ = json.Marshal(m["D"])
    fmt.Println(string(bs))
}
howcrazy 创建的更多回复