首页 > 解决方案 > 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

标签: jsongostruct

解决方案


你没有得到你想要的输出是因为你使用了嵌入式结构ContentItemDataManagement不是字段名称来添加到结构中。

使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称 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


推荐阅读