在 Go 中解组通用 json

Jér*_*out 4 json go

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

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

这是我当前不起作用的代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

这段代码在运行时返回给我:

id : 
name : 
Run Code Online (Sandbox Code Playgroud)

你有什么主意吗 ?

谢谢

use*_*778 14

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

var anyJson map[string]interface{}
json.Unmarshal(bytes, &anyJson)
Run Code Online (Sandbox Code Playgroud)

您将能够像这样访问这些字段:

anyJson["id"].(string)
Run Code Online (Sandbox Code Playgroud)

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


jws*_*jws 5

当您不知道“通用 JSON”具有什么架构时,要解析它:

    var parsed any
    err := json.Unmarshal(jsonText, &parsed)
Run Code Online (Sandbox Code Playgroud)

返回anyparsed将是 amap[string]any[]anynil单个值float64, bool, string

您可以测试类型并做出相应反应。

import (
    "encoding/json"
    "fmt"
)

func test(jsonText []byte) {
    // parsing
    var parsed any
    err := json.Unmarshal(jsonText, &parsed)
    if err != nil {
        panic(err) // malformed input
    }

    // type-specific logic
    switch val := parsed.(type) {
    case nil:
        fmt.Println("json specifies null")
    case map[string]any:
        fmt.Printf("id:%s name:%s\n", val["id"], val["name"])
    case []any:
        fmt.Printf("list of %d items\n", len(val))
    case float64:
        fmt.Printf("single number %f\n", val)
    case bool:
        fmt.Printf("single bool %v\n", val)
    case string:
        fmt.Printf("single string %s\n", val)
    default:
        panic(fmt.Errorf("type %T unexpected", parsed))
    }
}
Run Code Online (Sandbox Code Playgroud)


mol*_*ier 0

您必须导出您的字段:

type myStruct1 struct {
        Id string
        Name string
}
Run Code Online (Sandbox Code Playgroud)

请参阅文档中导出的标识符