Как предотвратить встраивание массива в другой массив в моем ответе json

#json #postgresql #go #go-gorm

#json #postgresql #Вперед #go-gorm

Вопрос:

На моем сервере API я возвращаю объект json, в котором есть массивы строк. Я обнаружил, что мои массивы встраиваются в другой массив, подобный этому:

            "Items": [
                "["QQTISGXSJIS4DEV36JCBWQ4X", "HCOWEB7NVIQEUAINMM2KUV6J", "FCKP7D3H6Q7RQIRKSPVZBRHL", "UQLVH65PPBTVK6KMIV5KMGY6", "UR2XTXJFVURE5ERBLNW7ZUCR", "75N66F4DYGPM57V47N3IBMKD", "HQ2CRXQFPQM7TNNDZXZ2MQ2B", "3SLGKFR5GPHVZMQM4YM6KI4U", "UCQ3J7GYAYPZOCQKWIRGNGNY", "6INWDYWUFX6L5JYX2HEVMMHX", "ASQBRMKYSK2TINHBYQIWATS5", "QPCHVJ4HXYTUJNEZWQCKM5I3", "7JPYYH64Y3FQK6YJX5NBXMM6", "BI4NIBBOFBYAAS7ZROD6XEMB", "RGU3X36VYMXX4N3XPEZKY76K", "PLHVIQ7QT6TBWI5BZX6EJI74", "YATHGR6W6BIKFYXVZMGVBRB4", "ZZ5KZ5ZSBVLQRDKR2SJQ5CXW", "TNH56AOIMFSLOX5AW5I6WYP2", "VIFSURNJWJ6YYKXIWTWRNY6F"]"
            ]
  

Вы можете создать полный объект JSON здесь:https://gist.github.com/yshuman1/31b39333e2cd187707d98817171c3914

Я использую gorm и сохраняю свой массив как pq.stringArray.

Вот моя функция, которая возвращает этот json:

 func (u *Users) RetrieveItemCatModSort(w http.ResponseWriter, r *http.Request) {
    var l model.ItemCatModSort
    type data struct {
        Email    string
        Password string
        Location string
    }
    var form data
    if err := parseForm(r, amp;form); err != nil {
        log.Infof("error parsing form for logging in Kiosk %v", err)
        return
    }
    user, err := u.us.ByEmail(string(form.Email))
    if err != nil {
        log.Infof("error looking up user by email while retrieving items %v", err)
        return
    }
    bcrypt.CompareHashAndPassword([]byte(user.KioskPwHash), []byte(form.Password))
    if err != nil {
        log.Infof("invalid login credentials error: %v submitted data:n%#v", err, form)
        w.Header().Set("Content-Type", "application/json; charset=UTF-8")
        w.WriteHeader(422) // unprocessable entity
        if err := json.NewEncoder(w).Encode(err); err != nil {
            panic(err)
        }
    }

    //lookup oauth token in DB
    token, err := u.os.Find(user.ID, "square")
    if err != nil {
        fmt.Println(err)
    }
    l.LocationID = form.Location

    l.Modifiers, err = pos.GetModifiers(token.AccessToken, l.LocationID)
    if err != nil {
        log.Infof("Error grabbing modifiers using GetInventory. %#v", err)
    }
    l.Categories, err = pos.GetCategories(token.AccessToken)
    if err != nil {
        log.Infof("Error grabbing categories using GetInventory. %#v", err)
    }

    l.Items, err = pos.GetItems(token.AccessToken, l.LocationID)
    if err != nil {
        log.Infof("Error grabbing items using GetInventory. %#v", err)
    }
    l.ItemSort, err = u.is.FindItemSortByLocation(l.LocationID)
    if err != nil {
        log.Infof("Error grabbing item sort. %#v", err)
    }
    l.CatSort, err = u.is.FindCatSortByLocation(l.LocationID)
    if err != nil {
        log.Infof("Error grabbing cat sort. %#v", err)
    }

    lJSON, err := json.Marshal(l)
    if err != nil {
        log.Infof("error marshalling data to lJSON inside  RetrieveLocationInv %v", err)
        return
    }

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

}
  

Вот некоторые из моделей, которые я использую:

 type Categories struct {
    Categories []Category `json:"objects"`
}

type ItemCatModSort struct {
    LocationID string
    Categories Categories
    Items      []Item
    Modifiers  []Modifier
    ItemSort   []ItemSort
    CatSort    CatSort
}

type CatSort struct {
    gorm.Model
    LocationID string
    Category   pq.StringArray `gorm:"type:varchar(10485760)[]"`
}

type Item struct {
    gorm.Model
    Type                  string    `json:"type"`
    ID                    string    `json:"id"`
    UpdatedAt             time.Time `json:"updated_at"`
    Version               int64     `json:"version"`
    IsDeleted             bool      `json:"is_deleted"`
    PresentAtAllLocations bool      `json:"present_at_all_locations"`
    PresentAtLocationIds  []string  `json:"present_at_location_ids"`
    AbsentAtLocationIds   []string  `json:"absent_at_location_ids"`
    ItemData              struct {
        Name             string `json:"name"`
        Description      string `json:"description"`
        Visibility       string `json:"visibility"`
        CategoryID       string `json:"category_id"`
        ModifierListInfo []struct {
            ModifierListID       string `json:"modifier_list_id"`
            Visibility           string `json:"visibility"`
            MinSelectedModifiers int    `json:"min_selected_modifiers"`
            MaxSelectedModifiers int    `json:"max_selected_modifiers"`
            Enabled              bool   `json:"enabled"`
        } `json:"modifier_list_info"`
        ImageURL   string `json:"image_url"`
        Variations []struct {
            Type                  string    `json:"type"`
            ID                    string    `json:"id"`
            UpdatedAt             time.Time `json:"updated_at"`
            Version               int64     `json:"version"`
            IsDeleted             bool      `json:"is_deleted"`
            PresentAtAllLocations bool      `json:"present_at_all_locations"`
            PresentAtLocationIds  []string  `json:"present_at_location_ids"`
            AbsentAtLocationIds   []string  `json:"absent_at_location_ids"`
            ItemVariationData     struct {
                ItemID      string `json:"item_id"`
                Name        string `json:"name"`
                Sku         string `json:"sku"`
                Ordinal     int    `json:"ordinal"`
                PricingType string `json:"pricing_type"`
                PriceMoney  struct {
                    Amount   int    `json:"amount"`
                    Currency string `json:"currency"`
                } `json:"price_money"`
            } `json:"item_variation_data"`
        } `json:"variations"`
        ProductType        string `json:"product_type"`
        SkipModifierScreen bool   `json:"skip_modifier_screen"`
    } `json:"item_data"`
}

  

в основном вместо

 "Items": [
                "["QQTISGXSJIS4DEV36JCBWQ4X", "HCOWEB7NVIQEUAINMM2KUV6J",... "VIFSURNJWJ6YYKXIWTWRNY6F"]" ]
  

похоже, я бы хотел, чтобы это выглядело так:

  "Items": ["QQTISGXSJIS4DEV36JCBWQ4X", "HCOWEB7NVIQEUAINMM2KUV6J",... "VIFSURNJWJ6YYKXIWTWRNY6F" ]
  

Комментарии:

1. Отсутствует определение типа Item .

2. спасибо, что уловил это @MarkusWMahlberg, я отредактировал, чтобы добавить его в