繁体   English   中英

json.Unmarshal 嵌套对象成字符串或 []byte

[英]json.Unmarshal nested object into string or []byte

我正在尝试解组一些 json,以便嵌套对象不会被解析,而只是被视为string[]byte

所以我想得到以下信息:

{
    "id"  : 15,
    "foo" : { "foo": 123, "bar": "baz" }
}

解组为:

type Bar struct {
    ID  int64  `json:"id"`
    Foo []byte `json:"foo"`
}

我收到以下错误:

json: cannot unmarshal object into Go value of type []uint8

游乐场演示

我认为您正在寻找的是encoding/json包中的RawMessage类型。

该文档指出:

输入 RawMessage [] 字节

RawMessage 是一个原始编码的 JSON 对象。 它实现了 Marshaler 和 Unmarshaler,可用于延迟 JSON 解码或预计算 JSON 编码。

这是一个使用 RawMessage 的工作示例:

package main

import (
    "encoding/json"
    "fmt"
)

var jsonStr = []byte(`{
    "id"  : 15,
    "foo" : { "foo": 123, "bar": "baz" }
}`)

type Bar struct {
    Id  int64           `json:"id"`
    Foo json.RawMessage `json:"foo"`
}

func main() {
    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]}

操场

Foo 类型是 map[string]string 所以正确定义 Foo :

type Bar struct {
    id int64
    Foo map[string]string
}

认为这样会更好

定义实现Unmarshaler接口的类型使您可以访问正在解析的[]byte

type Prefs []byte

func (p *Prefs) UnmarshalJSON(b []byte) error {
    *p = make(Prefs, len(b))
    copy(*p, b)
    return nil
}

游乐场演示

经过一番修补后,我发现在您的游乐场演示中,最大的问题是将 json 类型转换为 []byte。 要了解我的意思,请看一下这个游乐场: http ://play.golang.org/p/M0706KCZbh

如果你运行它,你会注意到 typecast slice 和 marshaled slice 之间的 []byte 在 'Prefs' 变量的点附近不同。

从结构封送的 json

[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 34 101 121 65 105 90...

类型转换 [] 字节

[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 123 34 102 111 111 34...

我已经删除了空白以尝试使其尽可能对齐。 主要的收获是,类型转换不会产生与通过 json.Marshal 方法运行数据相同的结果,并且要使这项工作正常工作,您需要一个自定义类型来处理 json 包无法识别的内容的解组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM