如何在某些成员受保护/内部/隐藏时编组结构

Jac*_*cob 2 marshalling go

如何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)

http://play.golang.org/p/my52DAn0-Z

fab*_*ioM 7

您可以通过实现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)


ANi*_*sus 5

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接口并手动进行编码。