Синтаксический анализ строки JSON, вложенной в POST с формой urlencoded - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь разобрать часть почтового уведомления. Это запрос POST с телом x-www-form-urlencoded. Вот часть тела:

sender: some@email.com
attachments: [{"url": "https://storage.eu.mailgun.net/v3/domains/beep.boop/messages/randomstring/attachments/0", "content-type": "application/pdf", "name": "example.pdf", "size": 345}]"]

Значение attachments представляет собой json кодированный массив

Я бы хотел декодировать эту строку из JSON во вложенную структуру StoredAttachment какЯ расшифровываю ответ как x-www-form-urlencoded, но я не знаю, как это сделать. Цель structs выглядит следующим образом:

type NotifiedMessage struct {
    Sender      string `schema:"sender"`
    Subject     string `schema:"subject"`
    Attachments []StoredAttachment `schema:"attachments"`
    MessageUrl  string `schema:"message-url"`
}

// StoredAttachment structures contain information on an attachment associated with a stored message.
type StoredAttachment struct {
    Size        int    `json:"size"`
    Url         string `json:"url"`
    Name        string `json:"name"`
    ContentType string `json:"content-type"`
}

Вот мой нерабочий код: https://play.golang.org/p/Ofbw2VAYV28

1 Ответ

1 голос
/ 03 ноября 2019

Вы можете реализовать интерфейс TextUnmarshaler, пакет schema будет использовать этот интерфейс вместо выполнения процедуры по умолчанию, что позволяет настраивать демаршалинг.


1. Объявите тип с именем и используйте его в качестве типа поля Attachments. []StoredAttachment не названо. Так, например:

type AttachmentList []StoredAttachment

Почему? Потому что методы могут быть объявлены только для именованных типов.

2. Реализация интерфейса TextUnmarhsaler и выполнение там разборки json.

func (ls *AttachmentList) UnmarshalText(text []byte) (err error) {
    return json.Unmarshal(text, (*[]StoredAttachment)(ls))
}

Вот и все.

https://play.golang.org/p/t65mI7JRFfS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...