gpt4 book ai didi

go - 如何将 JSON 字符串转换为字节数组?

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:36 25 4
gpt4 key购买 nike

我需要一些解码方面的帮助。我有这个示例代码:

package main

import (
"encoding/json"
"fmt"
)

type Obj struct {
Id string `json:"id"`
Data []byte `json:"data"`
}

func main() {
byt := []byte(`{"id":"someID","data":["str1","str2"]}`)

var obj Obj
if err := json.Unmarshal(byt, &obj); err != nil {
panic(err)
}

fmt.Println(obj)
}

我在这里尝试做的是 - 将字节转换为结构,其中一个字段的类型是 []byte。我得到的错误:

panic: json: cannot unmarshal string into Go struct field Obj.data of type uint8

这可能是因为解析器已经看到“数据”字段已经是一个 slice ,并试图将“str1”表示为一些字符字节码(类型为 uint8?)。

如何将整个data 值存储为一个字节数组?因为我想稍后将值解码到字符串片段。我没有将字符串片段包含到结构中,因为这种类型可以改变(字符串数组、int、字符串等),我希望这是通用的。

最佳答案

如果 []byte 确实 是您想要的,请使用 json.RawMessage 类型[]byte,同时也实现了JSON解析的方法。我相信这可能是您想要的,因为它会接受 data 中的任何内容。当然,您随后必须手动解析 Data 以弄清楚其中到底是什么。

一个可能的好处是,这会跳过任何繁重的解析,因为它只是复制了 byte。当您想将此数据用于某些用途时,您可以使用 []interface{},然后使用类型开关来使用各个值。

https://play.golang.org/p/og88qb_qtpSGJ

package main

import (
"encoding/json"
"fmt"
)

type Obj struct {
Id string `json:"id"`
Data json.RawMessage `json:"data"`
}

func main() {
byt := []byte(`{"id":"someID","data":["str1","str2", 1337, {"my": "obj", "id": 42}]}`)

var obj Obj
if err := json.Unmarshal(byt, &obj); err != nil {
panic(err)
}

fmt.Printf("%+v\n", obj)
fmt.Printf("Data: %s\n", obj.Data)

// use it
var d []interface{}
if err := json.Unmarshal(obj.Data, &d); err != nil {
panic(err)
}
fmt.Printf("%+v\n", d)

for _, v := range d {
// you need a type switch to deterine the type and be able to use most of these
switch real := v.(type) {
case string:
fmt.Println("I'm a string!", real)
case float64:
fmt.Println("I'm a number!", real)
default:
fmt.Printf("Unaccounted for: %+v\n", v)
}

}
}

关于go - 如何将 JSON 字符串转换为字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50660200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com