json - Golang 中的动态 JSON 结构未按预期运行
问题描述
我正在尝试创建一个结构,其中包含一些始终存在的基本字段和一些本身就是结构的可选字段。
我想知道为什么下面的代码:
package main
import (
"encoding/json"
"fmt"
"time"
)
type DataManagement struct {
DataManagement struct {
Type string
Asset struct {
LocalAssetUID string
Type string
}
*ContentProductionOrder
*ContentItem
TimeStamp time.Time
Hash string
}
}
type ContentProductionOrder struct {
ProductionOrderNo int
ItemNo int
StartDate time.Time
FinishDate time.Time
StatusID int
StatusDate time.Time
SourceTypeID int
TrackingID int
}
type ContentItem struct {
ItemNo int
ItemText string
Quantity int
}
func main() {
var contentItem ContentItem
contentItem.ItemNo = 123
contentItem.ItemText = "aaaaaaaa"
contentItem.Quantity = 3
var dataManagement DataManagement
dataManagement.DataManagement.Type = "asd"
dataManagement.DataManagement.Asset.LocalAssetUID = "asd"
dataManagement.DataManagement.Asset.Type = "asd"
dataManagement.DataManagement.ContentItem = &contentItem
dataManagement.DataManagement.TimeStamp = time.Now().UTC()
dataManagement.DataManagement.Hash = "123"
xy, _ := json.MarshalIndent(dataManagement, "", " ")
fmt.Println(string(xy))
xy, _ = json.MarshalIndent(contentItem, "", " ")
fmt.Println(string(xy))
}
输出到以下内容:
{
"DataManagement": {
"Type": "asd",
"Asset": {
"LocalAssetUID": "asd",
"Type": "asd"
},
"ItemText": "aaaaaaaa",
"Quantity": 3,
"TimeStamp": "2009-11-10T23:00:00Z",
"Hash": "123"
}
}
{
"ItemNo": 123,
"ItemText": "aaaaaaaa",
"Quantity": 3
}
而不是:
{
"DataManagement": {
"Type": "asd",
"Asset": {
"LocalAssetUID": "asd",
"Type": "asd"
},
"ContentItem": {
"ItemNo": 123,
"ItemText": "aaaaaaaa",
"Quantity": 3
},
"TimeStamp": "2009-11-10T23:00:00Z",
"Hash": "123"
}
}
{
"ItemNo": 123,
"ItemText": "aaaaaaaa",
"Quantity": 3
}
有任何想法吗?这可能很容易解释;我对 Golang 没有那么丰富的经验。
这是一个游乐场链接: https: //play.golang.org/p/iRDcaRIZ_ZU
解决方案
你没有得到你想要的输出是因为你使用了嵌入式结构ContentItem
而DataManagement
不是字段名称来添加到结构中。
使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称 T 或指向非接口类型名称 *T 的指针,并且 T 本身可能不是指针类型。非限定类型名称充当字段名称。
字段声明将解决您的问题。您应该将结构更改DataManagement
为:
type DataManagement struct {
DataManagement struct {
Type string
Asset struct {
LocalAssetUID string
Type string
}
*ContentProductionOrder // this is embedded struct
ContentItem *ContentItem
TimeStamp time.Time
Hash string
}
}
Go Playground上的工作代码
有关更多信息,请查看 Golang Spec for Struct Types
推荐阅读
- ipad - 我如何在 iPad 上的 Oracle PL SQL 中使用它?
- emacs - 西班牙语键盘中的 Emacs
- mysql - 如何比较表格的两列并显示第三个输出?
- node.js - 在我的 NodeJS/Express 服务器中使我的 MongoDB 实例模块化
- wso2 - [WSO2][ESB] Validation Mediator 给出问题,尽管失败的元素有孩子
- python - 改变 QCompleter 的风格?
- r - 从 2 列创建热图
- javafx - 如何在 javafx css 中使用 Vgrow ALWAYS 属性
- python - 获取索引属于另一个数据帧索引的数据帧行
- sql-server - T-SQL WHILE (选择 ())