使用空值解组字符串编码的json int使用null时的先前值

时间:2013-12-30 05:29:31

标签: json null go int unmarshalling

我正在尝试解组包含编码为字符串的整数的json。使用标签指定字段被编码为字符串是有效的,但是当字段为空时我遇到了问题。看来,主要问题是null不会被编码为字符串,因此解析器会忽略它并继续运行。问题在于它出于某种原因陷入了先前解码的值。

关于如何正确解析这个解析的任何想法?

我有以下代码:

package main

import (
    "encoding/json"
    "log"
)

type Product struct {
    Price int `json:",string,omitempty"`
}

func main() {
    data := `
[
{"price": "1"},
{"price": null},
{"price": "2"}
]
`

    var products []Product
    if err := json.Unmarshal([]byte(data), &products); err != nil {
        log.Printf("%#v", err)
    }
    log.Printf("%#v", products)

}

输出:

[]main.Product{main.Product{Price:1}, main.Product{Price:1}, main.Product{Price:2}}

Code on go playground

1 个答案:

答案 0 :(得分:2)

感觉就像json包中的bug。

你可以使用自定义Unmarshaller解决它,就像这样,虽然如果你有一个复杂的结构可能会很烦人:

func (p *Product) UnmarshalJSON(b []byte) error {
   m := map[string]string{}
   err := json.Unmarshal(b, &m)
   if err != nil {
      return err
   } 
   if priceStr, ok := m["price"]; ok {
      p.Price, _ = strconv.Atoi(priceStr)
   }
   return nil
}

http://play.golang.org/p/UKjfVqHCGi