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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何將具有嵌入式結(jié)構(gòu)的結(jié)構(gòu)展平為 json

如何將具有嵌入式結(jié)構(gòu)的結(jié)構(gòu)展平為 json

Go
蕭十郎 2023-02-21 13:01:07
給定以下結(jié)構(gòu)類型,StructA并且StructB嵌入在CompleteStructtype StructA struct {    A int `json:"a_a"`    B int `json:"a_b"`    C int `json:"a_c"`}type StructB struct {    A int `json:"b_a"`    B int `json:"b_b"`}type CompleteStruct struct {    Name string `json:"name"`    StructA    StructB}這s是一個(gè)新結(jié)構(gòu)。s := CompleteStruct{Name: "Example",    StructA: StructA{        A: 1,         B: 2,         C: 3,    },    StructB: StructB{        A: 4,        B: 5,    },}你如何轉(zhuǎn)化s為下面的json。[  {    "name": "Example",    "field": "a_a",    "value": 1  },  {    "name": "Example",    "field": "a_b",    "value": 2  },  {    "name": "Example",    "field": "a_c",    "value": 3  },  {    "name": "Example",    "field": "b_a",    "value": 4  },  {    "name": "Example",    "field": "b_b",    "value": 5  }]注意:實(shí)際上,CompleteStruct將包含 10 個(gè)或更多嵌入式結(jié)構(gòu),每個(gè)嵌入式結(jié)構(gòu)將包含 10 個(gè)或更多字段。所以我想要一個(gè)不需要單獨(dú)輸入每個(gè)字段的解決方案,我認(rèn)為這將需要使用反射
查看完整描述

2 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

不反思是解決不了的。簡(jiǎn)單示例:


func (u *CompleteStruct) MarshalJSON() ([]byte, error) {

    type Result struct {

        Name  string `json:"name"`

        Field string `json:"field"`

        Value any    `json:"value"`

    }

    

    var res []Result

    val := reflect.ValueOf(u).Elem()

    for i := 0; i < val.NumField(); i++ {

        field := val.Field(i)

        switch field.Kind() {

        case reflect.Struct:

            for i := 0; i < field.NumField(); i++ {

                tp := field.Type().Field(i)

                field := field.Field(i)

                res = append(res, Result{

                    Name:  u.Name,

                    Field: tp.Tag.Get("json"),

                    Value: field.Interface(),

                })

            }

        }

    }

    return json.Marshal(res)

}


查看完整回答
反對(duì) 回復(fù) 2023-02-21
?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

這應(yīng)該給你你想要的結(jié)構(gòu):


package main


import (

    "encoding/json"

    "os"

    "reflect"

)


type StructA struct {

    A int `json:"a_a"`

    B int `json:"a_b"`

    C int `json:"a_c"`

}

type StructB struct {

    A int `json:"b_a"`

    B int `json:"b_b"`

}


type CompleteStruct struct {

    Name string `json:"name"`

    StructA

    StructB

}


func main() {

    s := CompleteStruct{Name: "Example",

        StructA: StructA{

            A: 1,

            B: 2,

            C: 3,

        },

        StructB: StructB{

            A: 4,

            B: 5,

        },

    }


    flat(s)


    json.NewEncoder(os.Stdout).Encode(results)

}


type resp struct {

    Name  string `json:"name"`

    Field string `json:"field"`

    Value any    `json:"value"`

}


var globalName string

var results []resp


func flat(s interface{}) {

    st := reflect.TypeOf(s)

    for i := 0; i < st.NumField(); i++ {

        field := st.Field(i)

        if field.Type.Kind() == reflect.Struct {

            flat(reflect.ValueOf(s).Field(i).Interface())

        } else {

            name := field.Tag.Get("json")

            if name == "name" {

                globalName = reflect.ValueOf(s).Field(i).String()

                continue

            }

            results = append(results, resp{Name: globalName, Field: name, Value: reflect.ValueOf(s).Field(i).Interface()})

        }

    }

}

go run ./main.go | jq '.'


查看完整回答
反對(duì) 回復(fù) 2023-02-21
  • 2 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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