Go

时间:2016-03-17 13:31:37

标签: json generics go

我是一名新的Go程序员(来自Java),我想重现一种可以在Java中使用的通用方法。

我想创建一些函数,允许我对JSON字符串执行Unmarshal以避免代码重复。

这是我目前无效的代码:

type myStruct1 struct {
    id string
    name string
}

func (obj myStruct1) toString() string {
    var result bytes.Buffer
    result.WriteString("id : ")
    result.WriteString(obj.id)
    result.WriteString("\n")
    result.WriteString("name : ")
    result.WriteString(obj.name)

    return result.String()
}

func main() {

    content := `{id:"id1",name="myName"}`
    object := myStruct1{}
    parseJSON(content, object)

    fmt.Println(object.toString()) 
}

func parseJSON(content string, object interface{}) {
    var parsed interface{}
    json.Unmarshal([]byte(content), &parsed)
}

此代码在运行时返回给我:

id : 
name : 

你有什么想法吗?

由于

5 个答案:

答案 0 :(得分:2)

问题是你想写一个泛型类型?你可能想要一个字符串映射。无论如何,这适用于BSON:

var anyJson map[string]interface{}
json.Unmarshal(bytes, &anyJson)

您将能够访问如下字段:

anyJson["id"].(string)

不要忘记键入断言你的值,他们必须是正确的类型,否则他们会恐慌。 (您可以在golang网站上阅读有关类型断言的更多信息)

答案 1 :(得分:0)

您必须导出字段:

type myStruct1 struct {
        Id string
        Name string
}

请参阅文档中的Exported Identifiers

答案 2 :(得分:0)

Unmarshal只会设置结构的导出字段。

这意味着您需要修改json结构以使用大写字母:

type myStruct1 struct {
    Id string
    Name string
}

这背后的原因是json库无法使用reflect查看字段,除非它们被导出。

答案 3 :(得分:0)

您需要在代码中进行一些更改才能使其正常工作:

  1. 函数json.Unmarshal只能在你的struct中设置导出的变量,即以大写字母开头的变量。在ID内使用NamemyStruct1之类的变量名称。
  2. 您的内容无效JSON。你真正想要的是{"ID":"id1","Name":"myName"}
  3. 您已将object传递给parseJSON,但您使用的是parsed,而不是object。让parseJSON收到*myStruct(而不是interface{}),并在解组字符串时使用该变量而不是parsed。此外,始终处理错误返回,例如err := json.Unmarshal(content, object),并检查err
  4. 我建议你做Golang Tour;)

答案 4 :(得分:-1)

您还可以将文件设置为在另一个结构内具有动态属性的对象。这样一来,您就可以添加元数据,并以相同的方式读取它。

type MyFile struct {
    Version string
    Data  map[string]interface{}
}