json - 将 json 值解码到 []byte 中,有时字符串可能会被转义 json

标签 json go

我有一个看起来像这样的 json 响应

{
  "eventId":"fbf4a1a1-b4a3-4dfe-a01f-ec52c34e16e4",
  "eventType":"event-type",
  "eventNumber":0,
  "data":"{\n  \"a\": \"1\"\n}",
  "metaData":"{\n  \"yes\": \"no\"\n}",
  "streamId":"test",
  "isJson":true,
  "isMetaData":true,
  "isLinkMetaData":false,
  "positionEventNumber":0,
  "positionStreamId":"test",
  "title":"0@test",
  "id":"http://localhost:2113/streams/test/0",
  "updated":"2017-12-14T05:09:58.816079Z"
}

数据的键值对和元数据有时可能编码为 json,也可能不是。

我想将这些值解码成这样的字节数组。

// Event represent an event to be stored.
type Event struct {
    Data      []byte    `json:"data"`
    Metadata  []byte    `json:"metaData"`
}

但是当我尝试解码 json 对象时,出现以下错误:

输入字节 0 处有非法 base64 数据

我在这里做错了什么?

如果我将数据和元数据解码为字符串,它工作正常,但我不想使用字符串。

最佳答案

您正在寻找 json.RawMessage类型

它只是一个专门的 []byte,您可以根据需要使用它。

type Event struct {
    Data      json.RawMessage    `json:"data"`
    Metadata  json.RawMessage    `json:"metaData"`
}

然后您可以通过 []byte(e.Data)

将其视为文字 []byte

这是一个使用示例,on play :

package main

import (
    "encoding/json"
    "fmt"
)

var RAW = []byte(`
{
  "eventId":"fbf4a1a1-b4a3-4dfe-a01f-ec52c34e16e4",
  "eventType":"event-type",
  "eventNumber":0,
  "data":"{\n  \"a\": \"1\"\n}",
  "metaData":"{\n  \"yes\": \"no\"\n}",
  "streamId":"test",
  "isJson":true,
  "isMetaData":true,
  "isLinkMetaData":false,
  "positionEventNumber":0,
  "positionStreamId":"test",
  "title":"0@test",
  "id":"http://localhost:2113/streams/test/0",
  "updated":"2017-12-14T05:09:58.816079Z"
}
`)

type Event struct {
    Data     json.RawMessage `json:"data"`
    Metadata json.RawMessage `json:"metaData"`
}

func main() {
    var e Event
    err := json.Unmarshal(RAW, &e)
    fmt.Printf("%v -- %+v\n", err, e)
    b, err := json.Marshal(e)
    fmt.Printf("%v -- %s\n", err, b)
}

关于json - 将 json 值解码到 []byte 中,有时字符串可能会被转义 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47822192/

相关文章:

java - spring json 写入的 json 比我想要的多

json - 如何根据数组中的值在JQ中选择项目

java - Jersey 异常 : SEVERE: A message body reader for Java class

angularjs - NodeJS中,将数据库查询输出转换为Json格式

amazon-web-services - 无法使用Golang SDK在AWS athena上执行查询

android - POST 请求 Android 带有 json 中的参数

go - Go 中的 C : string ( int ( C. int ) ) 返回\u000X

mongodb - mgo中如何对数组元素进行多级推送?

postgresql - 两种不同形式的数据库连接字符串

go - 两个软件包之间的 channel 通信陷入僵局-Golang