代码之家  ›  专栏  ›  技术社区  ›  Aaron N. Brock

封送到json时转到转换类型

  •  0
  • Aaron N. Brock  · 技术社区  · 8 年前

    我的问题与 this one ,而不是转换 float64 到A string 使用 string tag . 在我的情况下,我试图转换 ObjectID 使用它的字符串 .Hex() 方法。反之亦然,使用 .FromHex() 在回来的路上发挥作用。

    但是,更一般地说,如何从类型转换 X 键入 Y &返回(amp;B) Marshal 安培; Unmarshal 惯性导航与制导?

    我的例子:

    package main
    
    import (
        "log"
        "fmt"
        "encoding/json"
        "github.com/mongodb/mongo-go-driver/bson/objectid"
    )
    
    type Greeting struct {
        Id          *objectid.ObjectID  `json:"id"`
        Greeting    string              `json:"greeting,omitempty"`
    }
    
    
    func main() {
        // Create ObjectID
        id, err := objectid.FromHex("5b14dd20f6418c8443a5ffec")
        if err != nil { log.Fatal(err) }
    
        // Create Greeting
        g := Greeting{&id, "Hello, World!"}
    
        // Marshal to json
        j, err := json.Marshal(g)
        if err != nil { log.Fatal(err) }
    
        // Print Json
        fmt.Printf("Json: %s", string(j))
    
    }
    

    输出:

    Json: {"id":[91,20,221,32,246,65,140,132,67,165,255,236],"greeting":"Hello, World!"}
    

    然而,我想要的是:

    Json: {"id":"5b14dd20f6418c8443a5ffec","greeting":"Hello, World!"}
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Bert Verhees    8 年前

    您应该编写自己的(un)封送处理函数,在该函数中处理转换/条件,并在调用json(un)封送处理时将其作为参数处理。

    type Whatever struct {
       someField int
    }
    
    func (w Whatever) MarshalJSON() ([]byte, error) {
        return json.Marshal(struct{
            SomeField int `json:"some_field"`
        }{
            SomeField: w.someField,
        })
    }
    
    func (w Whatever) MarshalJSON() ([]byte, error) {
       return json.Marshal(map[string]interface{}{
           "some_field": w.SomeField,
       })
    }
    
        2
  •  2
  •   Zippo    8 年前

    可以将命名类型声明为 objectid.ObjectId 这将实现 json.Marshaler 接口重写标准封送处理并输出十六进制字符串:

    type Id objectid.ObjectId
    
    func (id Id) MarshalJSON() ([]byte, error) {
        return json.Marshal(objectid.ObjectId(id).Hex())
    }
    

    用它代替 对象id.objectid 在你的结构中:

    type Greeting struct {
        Id Id
        Greeting string
    }
    

    现在,当你指挥一个 Greeting ,json包将封送 招呼 如预期,但自从 Id 现场工具 json.封送拆收器 ,它将由 Id.MarshalJSON 它将输出 id.Hex() .

    通过实现 json.Unmarshaler 接口 身份证件 .