带可选结构的JSON封送的嵌套Go结构

时间:2019-06-13 23:59:13

标签: json go struct

我正在尝试初始化一个嵌套结构,然后将其编组到JSON中以进行API响应。我遇到的挑战是组件之一(结构的一部分)可以具有n个成员,但可以是两种可能的类型(文本,图像)之一。

我要创建的JSON如下所示:

{
  "messages": [
    {
      "message_parts": [
        {
          "text": {
            "content": "dfdffd"
          }
        },
        {
          "image": {
            "url": "https://image.jpg"
          }
        }
      ],
      "actor_id": "44444444",
      "actor_type": "agent"
    }
  ],
  "channel_id": "44444444",
  "users": [
    {
      "id": "44444444"
    }
  ]
}

在message_parts切片中,该切片可以包含文本或图像中的至少一个,但也可以包含每个文本或图像中的一个。

我的结构目前看起来像这样:

   Type messagePayload struct {
        Messages  []Messages `json:"messages"`
        Status    string     `json:"status,omitempty"`
        ChannelID string     `json:"channel_id"`
        Users     []Users    `json:"users"`
    }
    type Messages struct {
        MessageParts []MessageParts `json:"message_parts"`
        ActorID      string         `json:"actor_id"`
        ActorType    string         `json:"actor_type"`
    }

    type Users struct {
        ID string `json:"id"`
    }
    type Text struct {
        Content string `json:"content,omitempty"`
    }
    type MessageParts struct {
        Text  *Text  `json:"text,omitempty"`
        Image *Image `json:"image,omitempty"`
    }
    type Image struct {
        URL string `json:"url,omitempty"`
    }

我真的很努力地以无法在json中显示的方式初始化它们。

这是我的位置,但显然不起作用:

payload := &messagePayload{
    Messages: []Messages{
        {
            MessageParts: []MessageParts{
                {
                    &Text{
                        Content: text,
                    },
                },
                {
                    &Image{
                        URL: mediaurl,
                    },
                },
            },
            ActorID:   agentID,
            ActorType: "agent",
        }},
    ChannelID: channelid,
    Users: []Users{
        {
            ID: user,
        },
    },
}

编辑: 感谢下面的提示和其他一些发现,我发现最好的方法是初始化有效负载,然后根据需要添加文本和图像的切片: here

1 个答案:

答案 0 :(得分:0)

如上所述,我能够找到一个解决方案-您需要在不包含文本或图像数据的情况下初始化有效负载,然后将它们附加到MessageParts切片中:

package main

import (
    "encoding/json"
    "fmt"
)

type messagePayload struct {
    Messages  []Messages `json:"messages"`
    Status    string     `json:"status,omitempty"`
    ChannelID string     `json:"channel_id"`
    Users     []Users    `json:"users"`
}
type Messages struct {
    MessageParts []MessageParts `json:"message_parts"`
    ActorID      string         `json:"actor_id"`
    ActorType    string         `json:"actor_type"`
}

type Users struct {
    ID string `json:"id"`
}
type Text struct {
    Content string `json:"content,omitempty"`
}
type MessageParts struct {
    Text  *Text  `json:"text,omitempty"`
    Image *Image `json:"image,omitempty"`
}
type Image struct {
    URL string `json:"url,omitempty"`
}

func main() {

    payload := &messagePayload{
        Messages: []Messages{
            {
                MessageParts: []MessageParts{

                },
                ActorID:   "id",
                ActorType: "agent",
            }},
        ChannelID: "cid",
        Users: []Users{
            {
                ID: "user1",
            },
        },
    }
    var text= new(MessageParts)
    text.Text = &Text{Content: "LOL"}
        var image = new(MessageParts)
        image.Image= &Image{URL: "https://"}
    payload.Messages[0].MessageParts = append(payload.Messages[0].MessageParts, *text)
    payload.Messages[0].MessageParts = append(payload.Messages[0].MessageParts, *image)
    m, err := json.Marshal(payload)
    if err != nil {
        fmt.Println("Error, ", err)
        return
    }
    fmt.Println(string(m))
}