首页 > 解决方案 > 为什么变量a(json字符串)没有解组到结构A?

问题描述

我可能在下面的代码中犯了一个菜鸟错误。这是去游乐场链接: https: //play.golang.org/p/WS_pPvBHUTH

我期待variable a(json string) 被解组为 struct oftype A但不知何故它最终成为type map[string]interface{}

package main

import (
    "encoding/json"
    "fmt"
)

type A struct {
    ParamA string
}

type B struct {
    ParamB string
}

var types = map[string]func() interface{}{
    "ParamA": func() interface{} { return A{} },
    "ParamB": func() interface{} { return B{} },
}

func Unmarshal(data []byte, key string) interface{} {
    //  if bytes.Contains(data, []byte("ParamA")) {
    //      var a A
    //      fmt.Printf("%+T\n", a)
    //      json.Unmarshal(data, &a)
    //      return a
    //  }
    //  var b B
    //  fmt.Printf("%+T\n", b)
    //  json.Unmarshal(data, &b)
    //  return b
    if tmp, ok := types[key]; ok {
        a := tmp()
        fmt.Printf("%+T\n", a)
        fmt.Println(string(data))
        if err := json.Unmarshal(data, &a); err != nil {
            return err
        }
        fmt.Printf("%+T\n", a)
        return a
    }
    return nil
}

func main() {
    a := []byte(`{"ParamA": "aaa"}`)
    b := []byte(`{"ParamB": "bbb"}`)

    resultA := Unmarshal(a, "ParamA")
    resultB := Unmarshal(b, "ParamC")
    fmt.Printf("%+v %+v\n", resultA, resultB)
}

预期输出:

main.A
{"ParamA": "aaa"}
main.A // <= this is what I want
{ParamA:aaa} <nil> // <= this is what I want

实际输出:

main.A
{"ParamA": "aaa"}
map[string]interface {} // <= but this is what I am getting 
map[ParamA:aaa] <nil> // <= but this is what I am getting

为什么变量a(json字符串)没有解组到结构A?真的卡在这里了……

标签: jsongostruct

解决方案


这里:

a := tmp()

a是类型interface{}。然后你json.Unmarshal(data,&a),并覆盖a.

您真正想要做的是,首先返回&A{}&B{}从您的工厂函数返回,然后:

a:=tmp()
json.Unmarshal(data,a) // Not &a

推荐阅读