首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Golang,将字节数组转换为字段类型为[]byte的结构

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

Stack Overflow用户
提问于 2018-06-03 03:00:03
回答 3查看 31K关注 0票数 4

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

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。我得到的错误是:

死机: json:无法将字符串解组到uint8类型的Go结构字段Obj.data中

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-03 03:11:32

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

如果data将是一个不同类型的JSON数组,那么你最好的选择就是使用[]interface{} - Go会很乐意地为你解组JSON,你可以在运行时执行检查,根据需要将它们转换为更具体的类型化变量。

票数 6
EN

Stack Overflow用户

发布于 2018-06-03 03:11:54

如果[]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)
        }

    }
}
票数 7
EN

Stack Overflow用户

发布于 2018-06-03 03:20:08

你的问题是:

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

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

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

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

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

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

fmt.Println(obj)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50660200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档