第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

來自 Postgres 的 Golang 嵌套 JSON 結(jié)果

來自 Postgres 的 Golang 嵌套 JSON 結(jié)果

Go
ibeautiful 2021-12-20 19:34:15
我正在使用杜松子酒和gorpSQL:SELECT p.project_id, p.name, COALESCE(NULLIF(json_agg(a.*)::TEXT, '[null]'), '[]')::JSON AS apps FROM project p LEFT JOIN app a USING (project_id) WHERE p.user_id=19 GROUP BY p.project_id, p.name ORDER BY project_id結(jié)果: 高朗type Project struct {    ID        int64           `db:"project_id, primarykey, autoincrement" json:"id"`    UserID    int64           `db:"user_id" json:"user_id"`    Name      string          `db:"name" json:"name"`    Status    int             `db:"status" json:"status"`    UpdatedAt int64           `db:"updated_at" json:"updated_at"`    CreatedAt int64           `db:"created_at" json:"created_at"`    Apps      json.RawMessage `json:"apps"`}func GetProjects(userID int64, page string) []Project {    var projects []Project    var err error    _, err = db.GetDB().Select(&projects, "SELECT p.project_id, p.name, COALESCE(NULLIF(json_agg(a.*)::TEXT, '[null]'), '[]')::JSON AS apps FROM project p LEFT JOIN app a USING (project_id) WHERE p.user_id=$1 GROUP BY p.project_id, p.name ORDER BY project_id LIMIT 10 OFFSET $2", userID, page)    fmt.Println("err", err)    return projects}并使用以下方法返回結(jié)果: c.JSON(200, gin.H{"data": projects})如果只有一個項目,它會起作用但如果有多個項目,則會出現(xiàn)以下錯誤:錯誤: json: error calling MarshalJSON for type json.RawMessage: invalid character '"' after top-level value有什么建議?PS:我是 Golang 的新手
查看完整描述

2 回答

?
森欄

TA貢獻1810條經(jīng)驗 獲得超5個贊

您可以使用此站點http://json2struct.mervine.net/根據(jù)結(jié)果獲得正確的結(jié)構(gòu)。只需復(fù)制選擇結(jié)果,并生成您體面的結(jié)構(gòu)

或者您可以生成具有項目結(jié)構(gòu)數(shù)組的新類型:

type Projects []Project


查看完整回答
反對 回復(fù) 2021-12-20
?
米琪卡哇伊

TA貢獻1998條經(jīng)驗 獲得超6個贊

我從這個答案中使用下面的這個解決方案使它工作


我不知道這是一個多么干凈的解決方案,但我最終制作了自己的數(shù)據(jù)類型JSONRaw。DB 驅(qū)動程序?qū)⑵湟暈?a,[]btye但json.RawMessage在 Go 代碼中仍可將其視為 a 。


這是一個復(fù)制粘貼重新實現(xiàn)MarshalJSON,并UnmarshalJSON從編碼/ JSON庫。


//JSONRaw ...

type JSONRaw json.RawMessage


//Value ...

func (j JSONRaw) Value() (driver.Value, error) {

    byteArr := []byte(j)


    return driver.Value(byteArr), nil

}


//Scan ...

func (j *JSONRaw) Scan(src interface{}) error {

    asBytes, ok := src.([]byte)

    if !ok {

        return error(errors.New("Scan source was not []bytes"))

    }

    err := json.Unmarshal(asBytes, &j)

    if err != nil {

        return error(errors.New("Scan could not unmarshal to []string"))

    }


    return nil

}


//MarshalJSON ...

func (j *JSONRaw) MarshalJSON() ([]byte, error) {

    return *j, nil

}


//UnmarshalJSON ...

func (j *JSONRaw) UnmarshalJSON(data []byte) error {

    if j == nil {

        return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")

    }

    *j = append((*j)[0:0], data...)

    return nil

}


//Project ....

type Project struct {

    ID        int64   `db:"project_id, primarykey, autoincrement" json:"id"`

    UserID    int64   `db:"user_id" json:"user_id"`

    Name      string  `db:"name" json:"name"`

    Status    int     `db:"status" json:"status"`

    UpdatedAt int64   `db:"updated_at" json:"updated_at"`

    CreatedAt int64   `db:"created_at" json:"created_at"`

    Apps      JSONRaw `json:"apps"`

}

http://img1.sycdn.imooc.com//61c06a73000103b903450432.jpg

但我想知道除此之外是否還有干凈的方法?

希望這也能幫助其他人。


查看完整回答
反對 回復(fù) 2021-12-20
  • 2 回答
  • 0 關(guān)注
  • 268 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號