Добавить к фрагменту структуры - PullRequest
0 голосов
/ 19 ноября 2018

У меня проблемы с инициализацией фрагмента структуры и добавлением к нему.

Я пытаюсь смоделировать приведенный ниже JSON, поэтому я создал структуру с именем Error для отдельных ошибок и часть ошибок для их хранения. Я знаю, что могу сделать errSlice := []Err{}, но это не будет показывать тег JSON.

{
  "errors": [
    {
      "status": "422",
      "source": { "pointer": "/data/attributes/firstName" },
      "title":  "Invalid Attribute",
      "detail": "First name must contain at least three characters."
    }
  ]
}

Моя попытка:

package main

import (
    "encoding/json"
    "net/http"
)

// ErrSlice is a slice of type Err
type ErrSlice struct {
    Errors []Err `json:"errors"`
}

// Err is an error
type Err struct {
    Status string `json:"status"`
    Source Source `json:"source"`
    Title  string `json:"title"`
    Detail string `json:"detail"`
}

// Source is struct of error source
type Source struct {
    Pointer string `json:"pointer"`
}

func main() {
    http.HandleFunc("/", foo)
    http.ListenAndServe(":9001", nil)
}

func foo(w http.ResponseWriter, r *http.Request) {

    errSlice := ErrSlice{}

    // New error
    err1 := Err{
        Status: "422",
        Source: Source{
            Pointer: "/data/attributes/firstName",
        },
        Title:  "Invalid Attribute",
        Detail: "First name must contain at least three characters.",
    }

    // Append err1 to errSlice
    errSlice = append(errSlice, err1) // error: "first argument to append must be slice"

    // Marshall errSlice
    jsonErrSlice, _ := json.Marshal(errSlice)

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusUnprocessableEntity)
    w.Write(jsonErrSlice)
}

Спасибо за ваше время!

1 Ответ

0 голосов
/ 19 ноября 2018

Я нашел способ получить требуемый формат, но я уверен, что есть более чистый способ реализовать это:

package main

import (
    "encoding/json"
    "net/http"
)

// Err struct are individual errors
type Err struct {
    Status string `json:"status"`
    Source Source `json:"source"`
    Title  string `json:"title"`
    Detail string `json:"detail"`
}

// Source is a struct for source inside an error
type Source struct {
    Pointer string `json:"pointer"`
}

// JSONErrors stores the json error data
type JSONErrors struct {
    Errors []Err `json:"errors"`
}

func main() {
    http.HandleFunc("/", foo)
    http.ListenAndServe(":9001", nil)
}

func foo(w http.ResponseWriter, r *http.Request) {

    // Create slice of errors
    errSlice := []Err{}

    // New error
    err1 := Err{
        Status: "422",
        Source: Source{
            Pointer: "/data/attributes/firstName",
        },
        Title:  "Invalid Attribute",
        Detail: "First name must contain at least three characters.",
    }

    // Append to error slice
    errSlice = append(errSlice, err1)

    // Assign errSlice to JSONErrors
    jsonErrRes := JSONErrors{Errors: errSlice}

    // Marshall errSlice
    jsonErrSlice, _ := json.Marshal(jsonErrRes)

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusUnprocessableEntity)
    w.Write(jsonErrSlice)

    // Results:
    // {
    //  "errors": [
    //      {
    //          "status": "422",
    //          "source": {
    //              "pointer": "/data/attributes/firstName"
    //          },
    //          "title": "Invalid Attribute",
    //          "detail": "First name must contain at least three characters."
    //      }
    //  ]
    // }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...