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

}

有任何想法吗?这可能很容易解释;我在 Golang 方面没有那么丰富的经验。



拉莫斯之舞
浏览 79回答 1
1回答

慕村225694

你没有得到你想要的输出是因为你使用了嵌入式结构而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 规范
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go