我需要一些解组的帮助。我有这个示例代码:
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等等),我希望它是通用的。
发布于 2018-06-03 03:11:32
我的第一个建议是,如果您知道输入类型将是字符串数组,那么只使用[]string
而不是[]byte
。
如果data
将是一个不同类型的JSON数组,那么你最好的选择就是使用[]interface{}
- Go会很乐意地为你解组JSON,你可以在运行时执行检查,根据需要将它们转换为更具体的类型化变量。
发布于 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)
}
}
}
发布于 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)
https://stackoverflow.com/questions/50660200
复制相似问题