Golang,将字节数组转换为带[]字节类型字段的结构

Golang,将字节数组转换为带[]字节类型字段的结构,go,Go,我需要一些解封的帮助。我有以下示例代码: 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

我需要一些解封的帮助。我有以下示例代码:

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)
}
我在这里尝试做的是将字节转换为结构,其中一个字段的类型是[]字节。我得到的错误是:

panic:json:无法将字符串解组到的Go struct字段Obj.data中 uint8型

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


如何将整个数据值存储为一个字节数组?因为我想稍后将值解组到字符串片段。我不在struct中包含字符串片段,因为这种类型可以更改(字符串数组、int、string等),我希望它是通用的。

我的第一个建议是,如果您知道输入类型将是字符串数组,那么只需使用
[]string
而不是
[]byte


如果
数据
将是一个具有各种类型的JSON数组,那么您最好的选择是使用
[]接口{}
——Go将很乐意为您解组JSON,您可以在运行时执行检查,根据需要将其转换为更具体的类型化变量

如果
[]byte
确实是您想要的,请使用
json.RawMessage
,它是
[]byte
类型的,但也实现了json解析的方法。我相信这可能是您想要的,因为它将接受以
数据
结尾的任何内容。当然,然后您必须手动解析
数据
,以了解其中的实际内容

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

你的问题是:

将字节数组转换为具有[]字节类型字段的结构

但是您没有bytearray,而是字符串数组。你的问题和你的例子不一样。因此,让我们回答您的问题,根据您希望偏离原始需求的程度,可能有更多的解决方案

一个字符串可以转换为一个字节片,两个字符串首先需要转换为一个字符串。这就是问题一。第二个问题是json字符串中的方括号

这很好,它隐式地将json字符串中的字符串转换为字节片:

byt := []byte(`{"id":"someID","data":"str1str2"}`)

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

fmt.Println(obj)

您正在呈现两个字符串,并希望它们适合单个字节片?我希望整个[“str1”,“str2”]为[]字节您的意思是希望整个字符串“[“str1”,“str2”]”为[]字节?正确,与内容无关。它只是在这个特定的情况下看起来像一个数组可能不,数据可以是任何东西-数组的东西,字符串,int,等等。在这个特定的情况下,我希望obj.data是
`[“str1”,“str2”]`
-注意`char,所以这应该是字节,而不是数组的东西看起来很有趣!“RawMessage”类型不是比接口{}或[]字节更昂贵吗?(只是问一下)@Alexey在回答中回答了这个问题,并添加了
RawMessage
的用法。如果你关心昂贵,那么json不是交换数据的很好选择,因为json是昂贵的,因为需要进行所有转换和创建结构。请看一看协议缓冲区,它们的设计是为了避免昂贵的JSONU处理,除非您实际需要它是
[]字节
,那么@Venantius有更好的答案。他不关心数组的内容。他希望整个过程是一个
[]字节
。没错,在另一种情况下,它可能根本不是一个数组,而是其他的东西,比如整数。因此,不要尝试查看[5]字节,其中第一个和最后一个字节是方括号中的字符。我认为,在这种情况下,RayfenWindspear的答案对您更有用,尽管它没有给您一个字节片。但如果你不在乎,那么维南提乌斯的答案也是合适的,而且更容易实现。我是在你最初问题的限定范围内回答的。这实际上可能比在我的回答中使用
json.RawMessage
要好。我想说这确实是应该做的,但我选择更具体地回答这个问题;)
byt := []byte(`{"id":"someID","data":"str1str2"}`)

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

fmt.Println(obj)