程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Go中为标量派生的类型实现UnmarshalJSON?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在Go中为标量派生的类型实现UnmarshalJSON??

开发过程中遇到如何在Go中为标量派生的类型实现UnmarshalJSON?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在Go中为标量派生的类型实现UnmarshalJSON?的解决方法建议,希望对你解决如何在Go中为标量派生的类型实现UnmarshalJSON?有所启发或帮助;

将指针接收器用于解组方法。如果使用值接收器,则方法返回时,对接收器的更改将丢失。

unmarshal方法的参数是JsON文本。解组JsON文本以获取纯字符串,并删除所有JsON引号。

func (intValue *PersonID) UnmarshalJsON(data []byte) error {
  var s string
  if err := Json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}

JsON标记与示例JsON之间不匹配。我更改了JsON以匹配标记,但是您可以使用其他方法进行更改。

if err := Json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {

[playground example](http://play.golang.org/p/-kOYet4CdH)

解决方法

我有一个简单的类型,可以在Go中实现子类型整数const到字符串的转换,反之亦然。我希望能够自动将JSON中的字符串解组为这种类型的值。我不能,因为UnmarshalJSON没有给我一种返回或修改标量值的方法。期望有一个结构,其成员由UnmarshalJSON设置。除内置标量类型外,“,string”方法不适用于其他类型。有没有一种方法可以为派生的标量类型正确实现UnmarshalJSON?

这是我所追求的例子。我希望它打印“ Hello Ralph”四次,但是它却打印“ Hello Bob”四次,因为PersonID未被更改。

package main

import (
    "encoding/json"
    "fmt"
)

type PersonID int

const (
    Bob PersonID = iota
    Jane
    Ralph
    Nobody = -1
)

var nameMap = map[string]PersonID{
    "Bob":    Bob,"Jane":   Jane,"Ralph":  Ralph,"Nobody": Nobody,}

var idMap = map[PersonID]string{
    Bob:    "Bob",Jane:   "Jane",Ralph:  "Ralph",Nobody: "Nobody",}

func (intValue PersonID) Name() string {
    return idMap[intValue]
}

func Lookup(name string) PersonID {
    return nameMap[name]
}

func (intValue PersonID) UnmarshalJSON(data []byte) error {
    // The following line is not correct
    intValue = Lookup(string(data))
    return nil
}

type MyType struct {
    Person   PersonID `json: "person"`
    Count    int      `json: "count"`
    Greeting string   `json: "greeting"`
}

func main() {
    var m MyType
    if err := json.Unmarshal([]byte(`{"person": "Ralph","count": 4,"greeting": "Hello"}`),&m); err != nil {
        fmt.Println(err)
    } else {
        for i := 0; i < m.Count; i++ {
            fmt.Println(m.Greeting,m.Person.Name())
        }
    }
}

大佬总结

以上是大佬教程为你收集整理的如何在Go中为标量派生的类型实现UnmarshalJSON?全部内容,希望文章能够帮你解决如何在Go中为标量派生的类型实现UnmarshalJSON?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: