我有一些JSON可以解構到各種結構中,這樣我就可以處理數據,看起來這正在變成項目中最難的部分!具有「有效」零值的解組JSON
這個JSON的格式是,如果該字段丟失,那麼它基本上是零。這是從Default struct values以下,但認爲它值得它自己的問題上SO。
零因此是一個有效的值,我需要能夠在我的Go代碼中辨別出這個值。有沒有辦法使用指針去解組到這個結構?
在示例playground中,您可以看到我的意思,它「出現」可以工作,但是當我打印出其中一個指針值時,它總是打印指針地址而不是實際值。
package main
import "fmt"
import "log"
import "encoding/json"
const inputMissing = `
["AAAAAA", {"testCode" : "Sss"}, 123456]
`
const inputZero = `
["AAAAAA", {"testCode" : "Sss", "missingInt" : 0, "defaultInt" : 0,"missingString" : "", "defaultString" : ""}, 123456]
`
type RawMessage struct {
AlwaysString string
ClientData ClientData
ReceptionTime int
}
type ClientData struct {
TestCode string
MissingInt *int
DefaultInt int
MissingString *string
DefaultString string
}
func main() {
var n RawMessage
if err := json.Unmarshal([]byte(inputMissing), &n); err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", n)
var o RawMessage
if err := json.Unmarshal([]byte(inputZero), &o); err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", o)
fmt.Printf("Should print the value of the int, not pointer... %i", o.ClientData.MissingInt)
}
func (n *RawMessage) UnmarshalJSON(buf []byte) error {
tmp := []interface{}{&n.AlwaysString, &n.ClientData, &n.ReceptionTime}
wantLen := len(tmp)
if err := json.Unmarshal(buf, &tmp); err != nil {
return err
}
if g, e := len(tmp), wantLen; g != e {
return fmt.Errorf("wrong number of fields in RawMessage: %d != %d", g, e)
}
return nil
}
我不明白。如果你需要這個值,你爲什麼不直接檢查'nil'的指針然後解除引用呢? –
我不確定unmarshal是否正確設置值。無論我做什麼,我都無法從'MissingInt'或'MissingString'讀取0(或任何其他值) –
也許一個更好的例子是https://play.golang.org/p/RWKCFtlhMk,我不能打印/閱讀555或測試 –