Golang嵌套结构体的显式赋值方法

Golang嵌套结构体的显式赋值方法 我正在开发一个需要输出JSON格式数据的模块。我已经有了JSON输出的结构,但不知道如何赋值。有人能建议如何实现以下结构吗?

JSON结构

type FinalJson struct {
	Stat        string `json:"status"`
	RAR struct {
		Stay bool `json:"Stay"`
		Rooms    []struct {
			Description    string  `json:"description"`
			Accessible     bool    `json:"accessible"`
			Rates          []struct {
				NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
				NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
				RatePlanID          string    `json:"ratePlanId"`
				CurrencyCode        string    `json:"currencyCode"
				TaxList []struct {
					TaxType    string `json:"taxType"`
					TaxPercent string `json:"taxPercent"`
				} `json:"taxList"`
				}`json:"Rates"`
				
				}`json:"Rooms"`
				}`json:"RAR"`
				}

这个结构中有更多嵌套结构,我只想找到为它们赋值的方法。需要分配的数据部分将是硬编码的,部分来自其他REST服务。

有人能帮忙吗?


更多关于Golang嵌套结构体的显式赋值方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

请在发帖时使用"预格式化文本"框。这样能让代码更易于阅读。选择需要放入黄色框内的文本,然后点击编辑器中类似"</>"的按钮。表情
我已经编辑了你的帖子来修正格式 表情

3 个赞

更多关于Golang嵌套结构体的显式赋值方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


能否请您尝试使用正确的Markdown格式将代码嵌入到帖子中,以便于阅读?

同时,提供一个展示您实际尝试分配数据的代码的Playground链接,将极大地帮助我们为您提供协助。

或者至少提供一个格式正确、包含main函数的代码,这样我们可以在本地运行并查看您尝试分配数据的过程。

但从我目前看到的情况来看,我可以告诉您,如果您将现有的匿名结构体提取为独立类型,事情会变得容易得多。如果不进行提取,您将需要在每个字面量赋值中重复定义这些结构体。

抱歉,我无法运行你的示例,因为缺少 XML 文件。

另外,请尝试提供一个最小可复现示例

但你说:

//Unable to do something like
result.RoomsAndRates.Rooms[0].Description = "Spmething"

当然不行,因为此时 result.RoomsAndRates.Roomsnil,你需要向其中追加元素:

result.RoomsAndRates.Rooms = append(result.RoomsAndRates.Rooms, struct{…}{Description: "Spmething"}

如果你按照我之前说的提取了匿名结构体,你可以简单地这样做:

result.RoomsAndRates.Rooms = append(result.RoomsAndRates.Rooms, RoomType{Description: "Spmething"}

感谢您抽出时间回复。

我认为可以通过使用映射来克服这个困难。我的想法是在映射中创建映射,最后将其序列化以获得所需的JSON。这样我就能完全控制哪些内容会进入映射的键和值,这些将成为输出JSON的一部分。通过这种方式,我就不需要定义结构体了。对此有什么建议吗?请参考以下可行的示例代码。

我不清楚使用映射或您建议的结构体方式在性能上有何差异。

//Below Sample Code
package main

import 
(
"fmt"
"encoding/json"
)
func main() {
    testMap := make(map[string]interface{})
	testMap["a"]="User1"


	 innerMap := make(map[string]string)

	innerMap["c"]="Test"

	innerMap["d"]="Tst1"

	testMap["b"]=innerMap

   out,_ :=json.Marshal(testMap)
   fmt.Println(string(out))
   
}
package main

import (
	"encoding/json"
	"encoding/xml"
	"fmt"
	"io/ioutil"
)

// 最终JSON输出的结构体

type FinalJson struct {
	Status        string `json:"status"`
	RoomsAndRates struct {
		FreeStay bool `json:"freeStay"`
		Rooms    []struct {
			Description    string  `json:"description"`
			RoomTypeCode   string  `json:"roomTypeCode"`
			NonSmoking     bool    `json:"nonSmoking"`
			ShortName      string  `json:"shortName"`
			MaxOccupancy   int     `json:"maxOccupancy"`
			InventoryCount int     `json:"inventoryCount"`
			LowRate        float64 `json:"lowRate"`
			BedType        string  `json:"bedType"`
			Accessible     bool    `json:"accessible"`
			Rates          []struct {
				NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
				NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
				RatePlanID          string    `json:"ratePlanId"`
				CurrencyCode        string    `json:"currencyCode"`
				DateRateMap         struct {
					Zero3032018 float64 `json:"03/03/2018"`
					Zero3042018 float64 `json:"03/04/2018"`
				} `json:"dateRateMap"`
				TaxList []struct {
					TaxType    string `json:"taxType"`
					TaxPercent string `json:"taxPercent"`
				} `json:"taxList"`
				CancelPolicy      string      `json:"cancelPolicy"`
				DepositPolicy     string      `json:"depositPolicy"`
				NightBeforeTaxMin float64     `json:"nightBeforeTaxMin"`
				NightAfterTaxMin  float64     `json:"nightAfterTaxMin"`
				NightBeforeTaxMax float64     `json:"nightBeforeTaxMax"`
				NightAfterTaxMax  float64     `json:"nightAfterTaxMax"`
				AverageBeforeTax  float64     `json:"averageBeforeTax"`
				AverageAfterTax   float64     `json:"averageAfterTax"`
				TotalBeforeTax    float64     `json:"totalBeforeTax"`
				TotalAfterTax     float64     `json:"totalAfterTax"`
				Qualified         bool        `json:"qualified"`
				Filtered          bool        `json:"filtered"`
				Express           bool        `json:"express"`
				QualPointsEarned  int         `json:"qualPointsEarned"`
				AutoEnroll        bool        `json:"autoEnroll"`
				AlternateRate     bool        `json:"alternateRate"`
				CorpCode          interface{} `json:"corpCode"`
				CugRate           bool        `json:"cugRate"`
				PacRatePlan       bool        `json:"pacRatePlan"`
				PacPoints         interface{} `json:"pacPoints"`
				TotalPacPoints    interface{} `json:"totalPacPoints"`
				FnsRatePlan       bool        `json:"fnsRatePlan"`
				FnsPoints         interface{} `json:"fnsPoints"`
				TotalFnsPoints    interface{} `json:"totalFnsPoints"`
			} `json:"rates"`
		} `json:"rooms"`
		RatePlans []struct {
			Rooms               []string    `json:"Rooms"`
			RoomsRate           []float64   `json:"RoomsRate"`
			LowRate             float64     `json:"LowRate"`
			RatePlanCode        string      `json:"RatePlanCode"`
			CancelCode          interface{} `json:"CancelCode"`
			CancelPenalty       string      `json:"CancelPenalty"`
			RatePlanDescription string      `json:"RatePlanDescription"`
			RatePlanName        string      `json:"RatePlanName"`
			AlternateRate       bool        `json:"alternateRate"`
			CorpCode            interface{} `json:"corpCode"`
			AutoEnroll          bool        `json:"autoEnroll"`
			DepositPolicy       []string    `json:"depositPolicy"`
			PacPoints           interface{} `json:"pacPoints"`
			PacRatePlan         bool        `json:"pacRatePlan"`
			CugRate             bool        `json:"cugRate"`
			FnsRatePlan         bool        `json:"fnsRatePlan"`
			FnsPoints           interface{} `json:"fnsPoints"`
			StrikeOutRate       interface{} `json:"strikeOutRate"`
			StrikeOutRatePlan   interface{} `json:"strikeOutRatePlan"`
		} `json:"ratePlans"`
	} `json:"roomsAndRates"`
}

func main() {

	// XML文件

	xmlFile, err := ioutil.ReadFile("TEst.xml")
	if err != nil {
		fmt.Print(err)
	}

	xmlStr := string(xmlFile) // 将内容转换为字符串

	rawXmlData := xmlStr

	var outData Envelope // Envelope是XML的结构体:已从此示例代码中移除

	xml.Unmarshal([]byte(rawXmlData), &outData)

	// outData包含来自XML响应的原始数据

	// 现在我想遍历这些原始数据,并将某些数据映射到JSON输出,其中涉及一些逻辑
	// 我无法直接为嵌套在内部的结构体赋值

	result := &FinalJson{
		Status: "OK",
	}
	result.RoomsAndRates.FreeStay = true // 工作正常

	// 无法执行类似这样的操作
	result.RoomsAndRates.Rooms[0].Description = "某个描述"

	jsonData, _ := json.Marshal(result)
	fmt.Print(string(jsonData))
}

我在代码中注释了我想要实现的功能…任何帮助都将不胜感激…

在Go语言中,为嵌套结构体赋值可以通过直接初始化或分步赋值来实现。以下是一个完整的示例,展示如何为你的FinalJson结构体赋值:

package main

import (
    "encoding/json"
    "fmt"
)

type FinalJson struct {
    Stat string `json:"status"`
    RAR  struct {
        Stay  bool `json:"Stay"`
        Rooms []struct {
            Description string `json:"description"`
            Accessible  bool   `json:"accessible"`
            Rates       []struct {
                NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
                NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
                RatePlanID          string    `json:"ratePlanId"`
                CurrencyCode        string    `json:"currencyCode"`
                TaxList             []struct {
                    TaxType    string `json:"taxType"`
                    TaxPercent string `json:"taxPercent"`
                } `json:"taxList"`
            } `json:"Rates"`
        } `json:"Rooms"`
    } `json:"RAR"`
}

func main() {
    // 方法1:直接初始化
    data := FinalJson{
        Stat: "success",
        RAR: struct {
            Stay  bool `json:"Stay"`
            Rooms []struct {
                Description string `json:"description"`
                Accessible  bool   `json:"accessible"`
                Rates       []struct {
                    NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
                    NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
                    RatePlanID          string    `json:"ratePlanId"`
                    CurrencyCode        string    `json:"currencyCode"`
                    TaxList             []struct {
                        TaxType    string `json:"taxType"`
                        TaxPercent string `json:"taxPercent"`
                    } `json:"taxList"`
                } `json:"Rates"`
            } `json:"Rooms"`
        }{
            Stay: true,
            Rooms: []struct {
                Description string `json:"description"`
                Accessible  bool   `json:"accessible"`
                Rates       []struct {
                    NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
                    NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
                    RatePlanID          string    `json:"ratePlanId"`
                    CurrencyCode        string    `json:"currencyCode"`
                    TaxList             []struct {
                        TaxType    string `json:"taxType"`
                        TaxPercent string `json:"taxPercent"`
                    } `json:"taxList"`
                } `json:"Rates"`
            }{
                {
                    Description: "豪华套房",
                    Accessible:  true,
                    Rates: []struct {
                        NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
                        NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
                        RatePlanID          string    `json:"ratePlanId"`
                        CurrencyCode        string    `json:"currencyCode"`
                        TaxList             []struct {
                            TaxType    string `json:"taxType"`
                            TaxPercent string `json:"taxPercent"`
                        } `json:"taxList"`
                    }{
                        {
                            NightRatesBeforeTax: []float64{100.0, 110.0, 120.0},
                            NightRatesAfterTax:  []float64{118.0, 129.8, 141.6},
                            RatePlanID:          "RP001",
                            CurrencyCode:        "USD",
                            TaxList: []struct {
                                TaxType    string `json:"taxType"`
                                TaxPercent string `json:"taxPercent"`
                            }{
                                {TaxType: "VAT", TaxPercent: "18%"},
                                {TaxType: "City Tax", TaxPercent: "2%"},
                            },
                        },
                    },
                },
            },
        },
    }

    // 方法2:分步赋值(更清晰)
    var data2 FinalJson
    data2.Stat = "success"
    data2.RAR.Stay = true
    
    // 添加房间
    room := struct {
        Description string `json:"description"`
        Accessible  bool   `json:"accessible"`
        Rates       []struct {
            NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
            NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
            RatePlanID          string    `json:"ratePlanId"`
            CurrencyCode        string    `json:"currencyCode"`
            TaxList             []struct {
                TaxType    string `json:"taxType"`
                TaxPercent string `json:"taxPercent"`
            } `json:"taxList"`
        } `json:"Rates"`
    }{
        Description: "标准间",
        Accessible:  false,
    }
    
    // 添加价格信息
    rate := struct {
        NightRatesBeforeTax []float64 `json:"nightRatesBeforeTax"`
        NightRatesAfterTax  []float64 `json:"nightRatesAfterTax"`
        RatePlanID          string    `json:"ratePlanId"`
        CurrencyCode        string    `json:"currencyCode"`
        TaxList             []struct {
            TaxType    string `json:"taxType"`
            TaxPercent string `json:"taxPercent"`
        } `json:"taxList"`
    }{
        NightRatesBeforeTax: []float64{80.0, 85.0, 90.0},
        NightRatesAfterTax:  []float64{94.4, 100.3, 106.2},
        RatePlanID:          "RP002",
        CurrencyCode:        "USD",
    }
    
    // 添加税率信息
    tax1 := struct {
        TaxType    string `json:"taxType"`
        TaxPercent string `json:"taxPercent"`
    }{TaxType: "VAT", TaxPercent: "18%"}
    
    rate.TaxList = append(rate.TaxList, tax1)
    room.Rates = append(room.Rates, rate)
    data2.RAR.Rooms = append(data2.RAR.Rooms, room)

    // 转换为JSON验证结果
    jsonData, _ := json.MarshalIndent(data, "", "  ")
    fmt.Println("方法1结果:")
    fmt.Println(string(jsonData))
    
    jsonData2, _ := json.MarshalIndent(data2, "", "  ")
    fmt.Println("\n方法2结果:")
    fmt.Println(string(jsonData2))
}

这个示例展示了两种赋值方法:

  1. 直接初始化:在声明时一次性完成所有嵌套结构体的赋值
  2. 分步赋值:先创建外层结构体,然后逐层为嵌套结构体赋值

分步赋值的方法更适合从REST服务获取数据后动态构建结构体,而直接初始化适合硬编码数据场景。两种方法都能正确生成所需的JSON格式。

回到顶部