我是Golang的新手,我需要从以下json字符串中获取数据。
{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}
现在我尝试了一个类似
的结构type IntervalData struct {
Data json.RawMessage `json:"data"`
Did string `json:"did"`
Sid string `json:"sid"`
}
type IntervalDataList []string
和json unmarshall代码如
r := IntervalData{}
json.Unmarshal([]byte(json), &r)
log.Printf("Raw Body: %s", r)
log.Printf("Raw Date Json: %s", r.Data)
blist := IntervalDataList{}
json.Unmarshal([]byte(r.Data), &blist)
log.Printf("Date List : %s", blist)
这段代码只能从json字符串获取sid和do,而不是显示为空映射的数据 什么是从json上面获取数据的方法。
更新:问题已解决。我检查了我的输入json是{"data":"[\"dsadsdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n\"sdsdadsddad\"]","did":"654646456","sid":"88683627434"}
的格式,这不是必需的形式。然后我检查了客户端脚本并根据在线资源进行更改。
How to JSONize a uint8 slice in Go?
type RequestData struct {
Data JSONableSlice `json:"data"`
Did string `json:"did"`
Sid string `json:"sid"`
}
type JSONableSlice []uint8
func (u JSONableSlice) MarshalJSON() ([]byte, error) {
var result string
if u == nil {
result = "null"
} else {
result = strings.Join(strings.Fields(fmt.Sprintf("%d", u)), ",")
}
return []byte(result), nil
}
func ApiRequest(w http.ResponseWriter, r *http.Request) {
sid := r.Header.Get("sid")
deviceID := r.Header.Get("deviceId")
body, err := ioutil.ReadAll(r.Body)
failOnError(err, "Issue faced during reading post contents")
data := RequestData{
Data: body,
Sid: sid,
Did: dID,
}
bdata, err := json.Marshal(data)
// Some Rabbit MQ Connection code
// Rabbit MQ publish code
err = ch.Publish(
"", // exchange
q.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
DeliveryMode: amqp.Persistent,
ContentType: "text/plain",
Body: bdata,
})
}
现在消费者代码中不需要太多更改
type IntervalData struct {
//Data json.RawMessage `json:"data"`
Data []byte `json:"data"`
Did string `json:"did"`
Sid string `json:"sid"`
}
r := IntervalData{}
json.Unmarshal([]byte(json), &r)
log.Printf("Raw Body: %s", r)
log.Printf("Raw Date Json: %s", r.Data)
blist := IntervalDataList{}
json.Unmarshal(r.Data, &blist)
log.Printf("Date List : %s", blist)
答案 0 :(得分:1)
在您的示例代码中,您指的是r.data
未导出的字段!但您的类型IntervalData
有一个导出的 IntervalData.Data
字段!这是不一致的。
因此,IntervalData
很可能包含未导出的 data
字段,json
包忽略,只有导出的字段被封送/解组。
只需更改要导出的IntervalData.data
字段:IntervalData.Data
。
请参阅此工作示例:
j := `{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}`
r := IntervalData{}
json.Unmarshal([]byte(j), &r)
log.Printf("Raw Body: %s", r)
log.Printf("Raw Data Json: %s", r.Data)
blist := IntervalDataList{}
json.Unmarshal([]byte(r.Data), &blist)
log.Printf("Data List : %s", blist)
输出(在 Go Playground 上试试):
2009/11/10 23:00:00 Raw Body: {["2016-06-21","2016-06-22","2016-06-25"] 123 ab}
2009/11/10 23:00:00 Raw Data Json: ["2016-06-21","2016-06-22","2016-06-25"]
2009/11/10 23:00:00 Data List : [2016-06-21 2016-06-22 2016-06-25]
另请注意,json.RawMessage
字段和第二次解编是不必要的,您可以将Data
定义为IntervalDataList
类型,并且它适用于单个解组:
Data IntervalDataList `json:"data"`
解散:
j := `{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}`
r := IntervalData{}
json.Unmarshal([]byte(j), &r)
log.Printf("Raw Data Json: %s", r.Data)
输出(在 Go Playground 上试试这个):
2009/11/10 23:00:00 Raw Data Json: [2016-06-21 2016-06-22 2016-06-25]
答案 1 :(得分:0)
下面的代码(或https://play.golang.org/p/kQRE7xYjrz中的代码)解析JSON字符串并提取/打印数据字段:
package main
import (
"encoding/json"
"fmt"
)
var data = []byte(`{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}`)
type IntervalDataList []string
type IntervalData struct {
Data IntervalDataList `json:"data"`
Did string `json:"did"`
Sid string `json:"sid"`
}
func main() {
r := &IntervalData{}
err := json.Unmarshal(data, r)
if err != nil {
panic(err)
}
fmt.Printf("Data: %#v\n", r.Data)
}
输出:
Data: main.IntervalDataList{"2016-06-21", "2016-06-22", "2016-06-25"}