如何LookupCode在编组时确保包含此结构中的字段?
package main
import (
"encoding/json"
"fmt"
)
type LookupCode struct {
code string `json:"code"`
name string `json:"name"`
}
func (l *LookupCode) GetCode() string {
return l.code
}
func main() {
c := &LookupCode{
code: "A",
name: "Apple",
}
b, _ := json.MarshalIndent(c, "", "\t")
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)
您可以通过实现json.Marshaller接口:
完整示例:http://play.golang.org/p/8mIcPwX92P
// Implement json.Unmarshaller
func (l *LookupCode) UnmarshalJSON(b []byte) error {
var tmp struct {
Code string `json:"code"`
Name string `json:"name"`
}
err := json.Unmarshal(b, &tmp)
if err != nil {
return err
}
l.code = tmp.Code
l.name = tmp.Name
return nil
}
func (l *LookupCode) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Code string `json:"code"`
Name string `json:"name"`
}{
Code: l.code,
Name: l.name,
})
}
Run Code Online (Sandbox Code Playgroud)
encode/json无法封送未导出的字段。将您的代码更改为:
type LookupCode struct {
Code string `json:"code"`
Name string `json:"name"`
}
Run Code Online (Sandbox Code Playgroud)
并在任何使用code或 的地方执行相同操作name。
游乐场:http : //play.golang.org/p/rak0nVCNGI
编辑
限制是由于在编组结构时使用了反射。如果需要不导出值,则必须实现json.Marshaller接口并手动进行编码。
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |