gpt4 book ai didi

json - 如何将重复的子结构从一个结构复制到另一个结构?

转载 作者:行者123 更新时间:2023-12-01 22:31:12 28 4
gpt4 key购买 nike

我有一个结构,我将一个大型 XML 文档解码到其中。
我希望从结构中提取某些元素并将它们复制到新结构中。然而,其中许多是在另一个结构中重复结构

考虑以下示例(整个结构的一小部分):

1)传入数据的格式

type ProductHeader struct {
Products struct {
ProductId string `xml:"ProductId"`
Product struct {
PriceBands struct {
PriceBand []struct {
UnitPrice string `xml:"UnitPrice"`
LowerQty string `xml:"LowerQty"`
UpperQty string `xml:"UpperQty"`
} `xml:"PriceBand"`
} `xml:"PriceBands"`
} `xml:"Product"`
} `xml:"Products"`
}

2)我希望输出的数据格式
type ProductOut struct {
ProductId string `json:"productId"`

PriceBands struct {
PriceBand []struct {
UnitPrice float32 `json:"unitPrice"`
LowerQty float32 `json:"lowerQty"`
UpperQty float32 `json:"upperQty"`
} `json:"priceBand"`
} `json:"PriceBands"`
}

示例 XML 输入
<?xml version="1.0" encoding="utf-8"?>
<ProductHeader>
<Products xmlns="">
<ProductId>123XYZ</ProductId>
<Product>
<PriceBands>
<PriceBand>
<UnitPrice>25.75</UnitPrice>
<LowerQty>0.00</LowerQty>
<UpperQty>100.00</UpperQty>
</PriceBand>
<PriceBand>
<UnitPrice>23.99</UnitPrice>
<LowerQty>100.01</LowerQty>
<UpperQty>1000.00</UpperQty>
</PriceBand>
<PriceBand>
<UnitPrice>21.00</UnitPrice>
<LowerQty>1000.01</LowerQty>
<UpperQty>NULL</UpperQty>
</PriceBand>
</PriceBands>
</Product>
</Products>
</ProductHeader>

示例目标输出
{
"productId" : "123XYZ",
"priceBands" : [
{
"unitPrice" : 25.75,
"lowerQty" : 0.00,
"upperQty" : 100.00
},
{
"unitPrice" : 23.99,
"lowerQty" : 100.01,
"upperQty" : 1000.00
},
{
"unitPrice" : 21.00,
"lowerQty" : 1000.01,
"upperQty" : null
}
]
}

如您所见,产品可能有多个价格区间。我最初以为我可以简单地以以下形式分配整个 PriceBands 元素:
var p1 ProductHeader
var p2 ProductOut

p2.PriceBands = p1.Products.Product.PriceBands

但这会产生一个编译器错误,这是有道理的,因为 PriceBand 的实例数量在编译时是可变的且未知的。

然而,这也很有意义:
p2.PriceBands.PriceBand = p1.ProductHeader.PriceBands.PriceBand

这使我认为我需要以某种方式遍历 PriceBands 结构。

在 Python 中,我可以做一些类似 For ProductBand in ProductBands 的事情。但该语法在 Go 中似乎不可用。

Go 中迭代结构 1) 并将价格带移动到结构 2) 的具体实例中的正确方法是什么,我随后可以将其解码为 JSON,如上面的示例输出所示。

最佳答案

正确的方法是:

  • 将输入 XML 流解码为 ProductIn变量 in
  • in 复制所需数据到 ProductOut变量 out , 使用任何必要的转换,包括 for ... range循环列表。

  • 如果 ProductOut 的整个子树完全匹配 ProductIn 的子树的结构,然后您可以在没有显式循环的情况下分配(例如 out.PriceBands = in.ProductHeader.PriceBands )。警告: inout对象现在通过引用(通过 slice )共享一些内存,并修改 in可能会修改 out .如果 in 就好了不再使用。

    在任何情况下,我都不建议对重复字段使用反射,它们应该转换成 slice 就好了。

    关于json - 如何将重复的子结构从一个结构复制到另一个结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59839169/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com