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
请在发帖时使用"预格式化文本"框。这样能让代码更易于阅读。选择需要放入黄色框内的文本,然后点击编辑器中类似"</>"的按钮。
我已经编辑了你的帖子来修正格式 
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.Rooms 是 nil,你需要向其中追加元素:
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))
}
这个示例展示了两种赋值方法:
- 直接初始化:在声明时一次性完成所有嵌套结构体的赋值
- 分步赋值:先创建外层结构体,然后逐层为嵌套结构体赋值
分步赋值的方法更适合从REST服务获取数据后动态构建结构体,而直接初始化适合硬编码数据场景。两种方法都能正确生成所需的JSON格式。

