处理 JSON 响应时,可能需要将某些嵌套对象保留为原始字符串或字节数组,而不是将它们解析为 Go 结构。为了解决这个问题,我们将探索使用encoding/json包中的json.RawMessage类型的解决方案。
在您的特定场景中,以下JSON:
{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }
将被解组转换为具有 int64 类型的 ID 字段和 []byte 类型的 Foo 字段的 Go 结构。您遇到的错误“json: 无法将对象解组为 []uint8 类型的 Go 值”,表明解组过程正在尝试将 foo 对象解析为 Go 值,这不是预期的行为。
json.RawMessage 类型为这个问题提供了解决方案。正如其文档所述,它是“原始编码的 JSON 对象”,可用于延迟 JSON 解码或预先计算 JSON 编码。使用 json.RawMessage,您可以有效地将 foo 对象保留为 Go 结构中的原始字节数组:
import ( "encoding/json" "fmt" ) type Bar struct { ID int64 `json:"id"` Foo json.RawMessage `json:"foo"` } func main() { var jsonStr = []byte(`{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }`) var bar Bar err := json.Unmarshal(jsonStr, &bar) if err != nil { panic(err) } fmt.Printf("%+v\n", bar) }
输出:
{Id:15 Foo:[123 32 34 102 111 111 34 58 32 49 50 51 44 32 34 98 97 114 34 58 32 34 98 97 122 34 32 125]}
通过利用 json.RawMessage,您可以现在成功将 JSON 解组为 Go 结构,该结构将 foo 对象视为字节数组。
以上是如何在 Go 中将 JSON 嵌套对象解组为字节数组?的详细内容。更多信息请关注PHP中文网其他相关文章!