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

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

動態(tài)返回不同類型的 JSON 結構?

動態(tài)返回不同類型的 JSON 結構?

Go
慕妹3242003 2022-01-04 10:49:08
我在玩 Go 并且無法將我的一些“繼承”設計從其他語言適應到它的結構。我已經用 OCaml 和其他一些具有類似結構的語言進行了編碼,但我很困惑。如果沒有類型繼承,使用共享結構從不同地方返回 JSON 會變得有點奇怪。我必須根據(jù)需要遞歸地遍歷輸入數(shù)據(jù)以構建單個 JSON 對象以進行響應。舉個例子:{    "appVersion": "1.0.0",    "messageStatus": "received"}... 和:{    "appVersion": "1.0.0",    "uploadStatus": "received"}到目前為止,我可以找到在 Go 中完成這項工作的唯一方法是將包含“appVersion”的基本結構分別復制并粘貼到兩個輸出生成函數(shù)中,但我不想這樣做,因為我不想必須兩次維護同一組代碼。這是我試圖解決這個問題的地方:type JSONResponse struct {    appVersion string}type MessageJSONResponse struct {    JSONResponse    messageStatus string}type UploadJSONResponse struct {    JSONResponse    uploadStatus string}... 然后:type Message struct {    formattingVersion *int}func NewMessageObject(r *http.Request) (bool, *MessageJSONResponse) {    message := new(Message)    if (true) {        // #TODO: INSERT LOGIC HERE!        *message.formattingVersion = 2;    }    if (message.formattingVersion != nil) {        response := new(MessageJSONResponse)        response.messageStatus = "OK"        return false, errorResponse    }    return true, nil}... 和:func init() {    http.Handle("/endpoints/message", JSONResponseHandler(messageHandler))}func JSONResponseHandler(h func (w http.ResponseWriter, r *http.Request) interface {}) http.Handler {// #TODO - convert `JSONResponse` into actual JSON or output JSON Error!}func messageHandler(w http.ResponseWriter, r *http.Request) JSONResponse { // #BROKEN TYPES?    hasError, messageResponse := NewMessageObject(r)    if (hasError || messageResponse==nil) { return nil } // #TODO    ////    // #TODO ... more message things.    return messageResponse;};這種方法(對不起任何代碼錯誤,真的很長的一天,我要睡覺了)不起作用,因為為了傳遞不同的返回值......類型不能改變,等等。該JSONResponseHandler包裝方法確實可以工作在我結束,但只有與interface {}類型給定式的變化......所以我離開它,因為它會弄亂代碼。但是,如果我interface {}在帶有可選星號返回屬性(例如“NewMessageObject”)的后續(xù)塊上使用,則 JSON 構造函數(shù)似乎會忽略這些值,因為它們被包裝在一個空接口中,而不僅僅是作為其原始類型公開。但是,他們必須有一個零選項......怎么了?一般的設計?我基本上是在嘗試通過基于輸入數(shù)據(jù)的后續(xù)調用構建一個 JSON 對象響應(或返回一個 JSON 格式的錯誤)......以一種巧妙抽象的方式。
查看完整描述

2 回答

?
DIEA

TA貢獻1820條經驗 獲得超3個贊

要解決您的 json 問題,您可以使用一個結構并用 json:"omitempty" 標記每個字段:


package main


import (

    "encoding/json"

    "fmt"

)


type foostruct struct {

    Myfoo   string `json:"myfoo,omitempty"`

    Yourfoo string `json:"yourfoo,omitempty"`

    Ourfoo string `json:"ourfoo,omitempty"`

}


func main() {

    j := []byte("{\"myfoo\":\"mine\", \"yourfoo\":\"yours\"}")

    fstruct := &foostruct{}

    err := json.Unmarshal(j, fstruct)

    if err != nil {

        panic(err)

    }


    b, err := json.Marshal(fstruct)

    if err != nil {

        panic(err)

    }


    fmt.Println(string(b))

}

您將看到輸出不包含字段“ourfoo”:


{"myfoo":"mine","yourfoo":"yours"}

在這里試試:http : //play.golang.org/p/zKwFaxbLJu


查看完整回答
反對 回復 2022-01-04
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

我在我的應用程序上使用 map 而不是 struct ,尤其是當我想向客戶端返回一個 json 答案時。它給了我更多的靈活性。請看看這個:


package main


import (

    "encoding/json"

    "fmt"

)


func main() {

    m := make(map[string]interface{})

    m["appVersion"] = "0.0.1"

    m["uploadStatus"] = "success"


    strJson, _ := json.Marshal(m)

    str := string(strJson)

    fmt.Println("---ENCODING--")

    fmt.Println(str)


    //put it back

    fmt.Println("---DECODING--")

    n := make(map[string]interface{})

    json.Unmarshal([]byte(str), &n)

    for key, val := range n {

        fmt.Println(key, ":", val)

    }

}

輸出是:


---ENCODING--

{"appVersion":"0.0.1","uploadStatus":"success"}

---DECODING--

appVersion : 0.0.1

uploadStatus : success

你可以在這里查看:http : //play.golang.org/p/h4b4-nkZ4M


查看完整回答
反對 回復 2022-01-04
  • 2 回答
  • 0 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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