Golang中的动态JSON结构无法正常运行

时间:2018-08-22 14:18:50

标签: json go struct

我正在尝试创建一个结构,该结构始终存在一些基本字段,而一些可选字段本身就是结构。

我想知道为什么下面的代码:

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

1 个答案:

答案 0 :(得分:2)

您没有得到想要的输出是因为您在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上的工作代码

有关更多信息,请查看Struct Types的Golang规范