将json值解组为[]字节,其中字符串有时可以转义为json

Vic*_*nez 1 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"
}
Run Code Online (Sandbox Code Playgroud)

数据的键值对,metaData有时可能是json编码,也可能不是.

我想将这些值解码为像这样的字节数组.

// Event represent an event to be stored.
type Event struct {
    Data      []byte    `json:"data"`
    Metadata  []byte    `json:"metaData"`
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试解组json对象时,我收到以下错误:

illegal base64 data at input byte 0

我在这里做错了什么?

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

Dav*_*rth 7

您正在寻找json.RawMessage类型

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

type Event struct {
    Data      json.RawMessage    `json:"data"`
    Metadata  json.RawMessage    `json:"metaData"`
}
Run Code Online (Sandbox Code Playgroud)

然后你可以把它当作文字[]字节来处理 []byte(e.Data)

这是一个在游戏中使用的例子:

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)
}
Run Code Online (Sandbox Code Playgroud)