Golang中如何解析JSON字符串

Golang中如何解析JSON字符串 我有以下代码:

a := alert{}  //结构体,包含几个字段,所有字段都是字符串类型
tmp := req.FormValue("payload")  //从调用中获取POST变量
json.Unmarshal( []byte(tmp), &a ); //解组并将字段放入alert结构体

我到处都看到使用这种语法的例子,tmp变量确实包含了我期望的JSON字符串。但是解组命令导致了一个空的alert结构体,而且我没有收到任何错误。

我该如何正确实现这个功能,显然我遗漏了某些东西。

谢谢,

3 回复

Unmarshal 只能对公开类型和公开字段进行操作。

更多关于Golang中如何解析JSON字符串的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,我现在还在适应大写字母的特殊规则。对于感兴趣的朋友,我把结构体字段的首字母改成了大写,现在一切正常了。

谢谢,

在Go语言中解析JSON字符串时,如果json.Unmarshal没有返回错误但结构体字段为空,通常是因为JSON键名与结构体字段名不匹配。Go的JSON包默认使用字段名作为键名,但会进行大小写不敏感的匹配。如果JSON键名与结构体字段名不完全一致(例如大小写不同),或者结构体字段未导出(即不是大写字母开头),解组操作会失败而不报错。

首先,确保你的alert结构体字段是导出的(即以大写字母开头),并且与JSON键名匹配。如果JSON键名与结构体字段名不同,可以使用结构体标签(struct tags)来指定映射。

以下是一个示例,展示如何正确实现JSON解析:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

// 定义alert结构体,字段必须导出(大写开头)
// 使用json标签指定JSON键名,如果JSON键名与字段名不同
type alert struct {
    ID      string `json:"id"`      // 如果JSON键为"id",映射到ID字段
    Message string `json:"message"` // 如果JSON键为"message",映射到Message字段
    // 添加其他字段...
}

func main() {
    // 模拟从请求中获取的JSON字符串
    tmp := `{"id": "123", "message": "This is an alert"}`

    a := alert{} // 初始化结构体

    // 解析JSON字符串到结构体
    err := json.Unmarshal([]byte(tmp), &a)
    if err != nil {
        log.Fatalf("Error unmarshaling JSON: %v", err)
    }

    // 输出结构体字段以验证解析结果
    fmt.Printf("ID: %s, Message: %s\n", a.ID, a.Message)
    // 输出: ID: 123, Message: This is an alert
}

如果JSON字符串中的键名与结构体字段名完全一致(包括大小写),可以省略json标签。例如,如果JSON是{"ID": "123", "Message": "This is an alert"},结构体可以简化为:

type alert struct {
    ID      string
    Message string
}

在你的代码中,检查tmp变量的实际内容,确保它是有效的JSON格式,并且键名与结构体字段匹配。如果问题仍然存在,请打印tmp字符串和错误信息进行调试:

fmt.Println("JSON string:", tmp)
err := json.Unmarshal([]byte(tmp), &a)
if err != nil {
    fmt.Printf("Unmarshal error: %v\n", err)
} else {
    fmt.Printf("Parsed struct: %+v\n", a)
}

这有助于识别JSON格式或映射问题。

回到顶部