首页 > 解决方案 > 将结构转换为 []json.RawMessage

问题描述

试图将结构转换为 []json.RawMessage。我的理解是 json.Marshal() 将其转换为 byte[],就像 []json.RawMessage 一样。但是,我似乎无法在两者之间进行转换。我的函数期望接收输入为[]json.RawMessage.

尝试了几种不同的方法,包括myIn := json.RawMessage(&myJsonStruct{"string1", "string2"})myIn := (*json.RawMessage)(json.Marshal(&myJsonStruct{"string1", "string2"}))

type myJsonStruct struct {
    myString       string  `json:"myString"`
    mySecongString string  `json:"mySecondString"`
}

myIn := json.Marshal(&myJsonStruct{"string1", "string2"})

myFunction(myIn)

myFunction(receivedIn []json.RawMessage) {
    //do work
    return
}

标签: jsongo

解决方案


这里有几件事:

  1. 您需要创建一个新切片,json.RawMessage以便将该预期类型myFunction作为参数传递给您的函数
  2. 将编组自定义结构的结果存储myJsonStruct在变量myIn(类型[]byte)中
  3. 创建一个myInRaw(type json.RawMessage) 的新变量并将其附加到先前创建的json.RawMessage.

然后,上述步骤将允许您将切片传递json.RawMessage给您的函数以完成进一步的工作。

请参阅下面的示例或操场上的工作示例:

package main

import (
    "encoding/json"
)

type myJsonStruct struct {
    myString       string `json:"myString"`
    mySecongString string `json:"mySecondString"`
}

func myFunction(receivedIn []json.RawMessage) {
    //do work
    return
}

func main() {

    var rawJSONSlice []json.RawMessage

    myIn, err := json.Marshal(
        &myJsonStruct{
            myString:       "string1",
            mySecongString: "string2",
        },
    )
    if err != nil {
        // catch err
    }

    myInRaw := json.RawMessage(myIn)

    rawJSONSlice = append(rawJSONSlice, myInRaw)

    myFunction(rawJSONSlice)
}

推荐阅读