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

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

在 Go 中使用匿名成員扁平化編組的 JSON 結(jié)構(gòu)

在 Go 中使用匿名成員扁平化編組的 JSON 結(jié)構(gòu)

Go
明月笑刀無情 2021-07-09 10:11:39
鑒于以下代碼:package mainimport (    "encoding/json"    "fmt")type User struct {    Id   int    `json:"id"`    Name string `json:"name"`}type Session struct {    Id     int `json:"id"`    UserId int `json:"userId"`}type Anything interface{}type Hateoas struct {    Anything    Links map[string]string `json:"_links"`}func MarshalHateoas(subject interface{}) ([]byte, error) {    h := &Hateoas{subject, make(map[string]string)}    switch s := subject.(type) {    case *User:        h.Links["self"] = fmt.Sprintf("http://user/%d", s.Id)    case *Session:        h.Links["self"] = fmt.Sprintf("http://session/%d", s.Id)    }    return json.MarshalIndent(h, "", "    ")}func main() {    u := &User{123, "James Dean"}    s := &Session{456, 123}    json, err := MarshalHateoas(u)    if err != nil {        panic(err)    } else {        fmt.Println("User JSON:")        fmt.Println(string(json))    }    json, err = MarshalHateoas(s)    if err != nil {        panic(err)    } else {        fmt.Println("Session JSON:")        fmt.Println(string(json))    }}在我的情況下,我試圖讓渲染的 JSON 看起來正確,這意味著:User JSON:{    "id": 123,    "name": "James Dean",    "_links": {        "self": "http://user/123"    }}Session JSON:{    "id": 456,    "userId": 123,    "_links": {        "self": "http://session/456"    }}文檔中沒有關(guān)于處理 JSON 中匿名成員的明確文檔:匿名結(jié)構(gòu)字段通常被編組,就好像它們的內(nèi)部導(dǎo)出字段是外部結(jié)構(gòu)中的字段一樣,受通常的 Go 可見性規(guī)則的約束,如下一段所述。在其 JSON 標(biāo)記中給出名稱的匿名結(jié)構(gòu)字段被視為具有該名稱,而不是匿名的。匿名結(jié)構(gòu)體字段的處理在 Go 1.1 中是新的。在 Go 1.1 之前,匿名結(jié)構(gòu)體字段被忽略。要強制忽略當(dāng)前版本和早期版本中的匿名結(jié)構(gòu)字段,請為該字段指定一個 JSON 標(biāo)記“-”。這并不清楚是否有辦法使之變平,或向 Marshaller 暗示我正在嘗試做的事情。我確信可能存在,因為存在特殊情況,具有特殊含義的魔術(shù)名稱可以在 XML 編組器中重命名 XML 文檔的根元素。在這種情況下,我也沒有以任何方式附加到代碼,我的用例是有一個函數(shù)來接受interface{}, *http.Request, http.ResponseWriter和寫回 HATEOAS 文檔,打開傳遞的類型,以推斷要寫回的鏈接進入 JSON。(因此訪問請求,請求主機、端口、方案等,以及類型本身以推斷 URL 和已知字段等)
查看完整描述

3 回答

?
滄海一幻覺

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

我認(rèn)為您嘗試生成的 JSON 不是有效的 JSON 對象,因此這可能是 JsonMarshal 不與您玩游戲的原因。


該對象可能無法通過 JavaScript 使用,因為它包含兩個對象,除非您將這些對象包裝在一個數(shù)組中。


[

    {

        "id": 123,

        "name": "James Dean",

        "_links": {

            "self": "http://user/123"

        }

    },

    {

        "id": 456,

        "userId": 123,

        "_links": {

            "self": "http://session/456"

        }

    }

]

然后你就可以使用這個 JSON,例如:


var user, session;

user = jsonString[0]; 

session = jsonString[1];

考慮給你的對象根名稱可能是一個更好的考慮,例如:


{

    "user": {

        "id": 123,

        "name": "James Dean",

        "_links": {

            "self": "http://user/123"

        }

    },

    "session": {

        "id": 456,

        "userId": 123,

        "_links": {

            "self": "http://session/456"

        }

    }

}

并消耗為,例如:


var user, session;

user = jsonString.user;

session = jsonString.session;

我希望這可以幫助你


查看完整回答
反對 回復(fù) 2021-07-12
?
大話西游666

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

利用omitempty標(biāo)簽和一些邏輯,以便您可以使用單一類型為不同情況生成正確的輸出。


訣竅是知道 JSON 編碼器何時將值視為空。從 encoding/json 文檔:


空值是 false、0、任何 nil 指針或接口值,以及任何長度為零的數(shù)組、切片、映射或字符串。


這是您的程序稍作修改以產(chǎn)生您想要的輸出。當(dāng)某些字段的值為“空”時,它會省略某些字段 - 具體而言,JSON 編碼器將省略帶有“0”作為值的整數(shù)并使用零長度映射。


package main


import (

    "encoding/json"

    "fmt"

)


type User struct {

    Id     int               `json:"id"`

    Name   string            `json:"name,omitempty"`

    UserId int               `json:"userId,omitempty"`

    Links  map[string]string `json:"_links,omitempty"`

}


func Marshal(u *User) ([]byte, error) {

    u.Links = make(map[string]string)

    if u.UserId != 0 {

        u.Links["self"] = fmt.Sprintf("http://user/%d", u.UserId)

    } else if u.Id != 0 {

        u.Links["self"] = fmt.Sprintf("http://session/%d", u.Id)

    }

    return json.MarshalIndent(u, "", "    ")

}


func main() {

    u := &User{Id: 123, Name: "James Dean"}

    s := &User{Id: 456, UserId: 123}

    json, err := Marshal(u)

    if err != nil {

        panic(err)

    } else {

        fmt.Println(string(json))

    }

    json, err = Marshal(s)

    if err != nil {

        panic(err)

    } else {

        fmt.Println(string(json))

    }

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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