当某些成员被保护/内部/隐藏时如何封送结构

How do ensure the fields in this LookupCode struct are included when marshalling?

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))
}

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

dongzhi2332
dongzhi2332 可能重复的golangjson和处理未导出的字段
大约 6 年之前 回复

3个回答

You can by implementing the json.Marshaller interface:

Full Example: 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,
    })
}
dsfsad089111
dsfsad089111 次要点,但是由于LookupCode的字段未导出,因此json包不使用,因此struct标记实际上并没有用于任何东西,可以(并且应该)将其删除。
大约 6 年之前 回复
duanhui1185
duanhui1185 太好了,谢谢!
大约 6 年之前 回复



encode / json </ code>无法封送未导出的字段。 将您的代码更改为:</ p>

  type LookupCode struct {
代码字符串json:“ code”
名称字符串json:“ name”
}
</ code> </ pre>

,并在任何使用 code </ code>或 name </ code>的地方进行相同的操作。</ p>

游乐场</ strong>: http://play.golang.org/p/rak0nVCNGI</ a> </ p>

编辑</ strong> </ p>

限制是由于编组结构时使用了反射。 如果您需要不导出值,则必须实现 json.Marshaller </ code >界面并手动进行编码。</ p>
</ div>

展开原文

原文

encode/json cannot marshal unexported fields. Change your code to:

type LookupCode struct {
    Code string `json:"code"`
    Name string `json:"name"`
}

and do the same wherever you use code or name.

Playground: http://play.golang.org/p/rak0nVCNGI

Edit

The limitation is due to the reflection used when marshalling the struct. If you need to keep your values unexported, you must implement the json.Marshaller interface and do the encoding manually.

if the struct has only string-type fields,you can try this hack way.

package main

import (
    "fmt"
    "reflect"

    "github.com/bitly/go-simplejson"
)

type A struct {
    name string `json:"name"`
    code string `json:"code"`
}

func marshal(a A) ([]byte, error) {
    j := simplejson.New()
    va := reflect.ValueOf(&a)
    vt := va.Elem()
    types := reflect.TypeOf(a)
    for i := 0; i < vt.NumField(); i++ {
        j.Set(types.Field(i).Tag.Get("json"), fmt.Sprintf("%v", reflect.Indirect(va).Field(i)))
    }
    return j.MarshalJSON()
}

func main() {
    a := A{name: "jessonchan", code: "abc"}
    b, _ := marshal(a)
    fmt.Println(string(b))
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐