Как предотвратить вставку массива в другой массив в моем ответе json - PullRequest
0 голосов
/ 02 апреля 2019

На моем сервере 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, &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\" ]
...