我是一名新的 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 站点上阅读有关类型断言的更多信息)
当您不知道“通用 JSON”具有什么架构时,要解析它:
var parsed any
err := json.Unmarshal(jsonText, &parsed)
Run Code Online (Sandbox Code Playgroud)
返回any的parsed将是 amap[string]any或[]any或nil单个值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)
您必须导出您的字段:
type myStruct1 struct {
Id string
Name string
}
Run Code Online (Sandbox Code Playgroud)
请参阅文档中导出的标识符。
| 归档时间: |
|
| 查看次数: |
9590 次 |
| 最近记录: |