亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將具有嵌入式結構的結構展平為 json

如何將具有嵌入式結構的結構展平為 json

Go
蕭十郎 2023-02-21 13:01:07
給定以下結構類型,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是一個新結構。s := CompleteStruct{Name: "Example",    StructA: StructA{        A: 1,         B: 2,         C: 3,    },    StructB: StructB{        A: 4,        B: 5,    },}你如何轉化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  }]注意:實際上,CompleteStruct將包含 10 個或更多嵌入式結構,每個嵌入式結構將包含 10 個或更多字段。所以我想要一個不需要單獨輸入每個字段的解決方案,我認為這將需要使用反射
查看完整描述

2 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

不反思是解決不了的。簡單示例:


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)

}


查看完整回答
反對 回復 2023-02-21
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

這應該給你你想要的結構:


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 '.'


查看完整回答
反對 回復 2023-02-21
  • 2 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號