在go中创建异构json数组

假设我有一个这样的结构:


type Message struct {

    Args   []interface{}

    Kwargs map[string]interface{}

}


message := Message{                                                                                                                                                                                            

    []interface{}{1, 2, 3, 4},                                                                                                                                                                                 

    map[string]interface{}{"a": 2, "b": 3},                                                                                                                                                                    

}

我应该如何编组消息以获得这样的 JSON?


[[1,2,3,4], {"a": 2, "b":3}]


慕工程0101907
浏览 136回答 2
2回答

慕姐4208626

您可以向您的结构添加一个编组方法来处理逻辑。在行的东西func (m Message) MarshalJSON() ([]byte, error) {    data := make([]interface{}, 0)    data = append(data, m.Args)    data = append(data, m.Kwargs)    return json.Marshal(data)}在操场上试试

慕虎7371278

您在输出中想要的是一个 JSON 数组,其中包含您的结构值的Args和字段,因此您可以通过编组以下切片值来获得您想要的内容:Kwargsmessage[]interface{}{message.Args, message.Kwargs}例如:message := Message{&nbsp; &nbsp; []interface{}{1, 2, 3, 4},&nbsp; &nbsp; map[string]interface{}{"a": 2, "b": 3},}err := json.NewEncoder(os.Stdout).&nbsp; &nbsp; Encode([]interface{}{message.Args, message.Kwargs})fmt.Println(err)上面的输出(在Go Playground上试试):[[1,2,3,4],{"a":2,"b":3}]<nil>这适用于这种特定情况。如果你想要一个像数组元素一样编组结构值字段的通用解决方案,你可以创建一个辅助函数,将字段“打包”到一个切片中:func getFields(i interface{}) (res []interface{}) {&nbsp; &nbsp; v := reflect.ValueOf(i)&nbsp; &nbsp; if v.Kind() == reflect.Ptr {&nbsp; &nbsp; &nbsp; &nbsp; v = v.Elem()&nbsp; &nbsp; }&nbsp; &nbsp; if v.Kind() != reflect.Struct {&nbsp; &nbsp; &nbsp; &nbsp; return nil&nbsp; &nbsp; }&nbsp; &nbsp; for i := 0; i < v.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; f := v.Field(i)&nbsp; &nbsp; &nbsp; &nbsp; if f.CanInterface() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = append(res, f.Interface())&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return res}以上getFields()接受结构值和指向结构的指针。使用它的例子:message := Message{&nbsp; &nbsp; []interface{}{1, 2, 3, 4},&nbsp; &nbsp; map[string]interface{}{"a": 2, "b": 3},}err := json.NewEncoder(os.Stdout).Encode(getFields(message))fmt.Println(err)err = json.NewEncoder(os.Stdout).Encode(getFields(&message))fmt.Println(err)输出(在Go Playground上尝试):[[1,2,3,4],{"a":2,"b":3}]<nil>[[1,2,3,4],{"a":2,"b":3}]<nil>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go