Вложенные структуры Go для маршалинга JSON с дополнительными структурами - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь инициализировать вложенную структуру, чтобы затем выполнить маршализацию в json для ответа API.Проблема, с которой я сталкиваюсь, состоит в том, что один из компонентов (часть структур) может иметь n элементов, но одного из двух возможных типов (текст, изображение).

JSON, который я хочу создать, выглядит следующим образом:this:

{
  "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,
        },
    },
}

РЕДАКТИРОВАТЬ: Благодаря подсказке ниже и нескольким другим выводам, я обнаружил, что лучший способ - инициализировать полезную нагрузку.и затем добавьте фрагменты для текста и изображений по мере необходимости: https://play.golang.org/p/Pmmv00spcI6

1 Ответ

0 голосов
/ 14 июня 2019

Как отмечалось выше, я смог найти решение - вам нужно инициализировать полезную нагрузку без текстовых или графических данных, а затем добавить их к срезу 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...