ネストされた構造体をマーシャリングしようとしています。非機能の例を参照してくださいhere(私はGoの遊び場で "計算"と "かなり"をインポートすることはできませんが、テストロジックを再作成して出力を貼り付けました)。Go:JSONマーシャリングのネスト構造体。外部フィールドを間違って省略します。
package main
import (
"encoding/json"
"fmt"
"github.com/kylelemons/godebug/pretty"
compute "google.golang.org/api/compute/v1"
)
type CreateInstance struct {
compute.Instance
// Additional metadata to set for the instance.
Metadata map[string]string `json:"metadata,omitempty"`
// OAuth2 scopes to give the instance. If none are specified
// https://www.googleapis.com/auth/devstorage.read_only will be added.
Scopes []string `json:",omitempty"`
// StartupScript is the Sources path to a startup script to use in this step.
// This will be automatically mapped to the appropriate metadata key.
StartupScript string `json:",omitempty"`
// Project to create the instance in, overrides workflow Project.
Project string `json:",omitempty"`
// Zone to create the instance in, overrides workflow Zone.
Zone string `json:",omitempty"`
// Should this resource be cleaned up after the workflow?
NoCleanup bool
// Should we use the user-provided reference name as the actual resource name?
ExactName bool
// The name of the disk as known internally to Daisy.
daisyName string
}
func main() {
ci := <a *CreateInstance part of a larger data structure>
j, _ := json.MarshalIndent(ci, "", " ")
fmt.Println(string(j))
pretty.Print(ci) # Pretty prints the struct.
}
##### OUTPUT #####
{
"disks": [
{
"source": "disk"
}
],
"machineType": "${machine_type}",
"name": "${instance_name}"
}
{Instance: {CanIpForward: false,
CpuPlatform: "",
CreationTimestamp: "",
Description: "",
Disks: [{AutoDelete: false,
Boot: false,
DeviceName: "",
DiskEncryptionKey: nil,
Index: 0,
InitializeParams: nil,
Interface: "",
Kind: "",
Licenses: [],
Mode: "",
Source: "disk",
Type: "",
ForceSendFields: [],
NullFields: []}],
Id: 0,
Kind: "",
MachineType: "${machine_type}",
Metadata: nil,
Name: "${instance_name}",
NetworkInterfaces: [],
Scheduling: nil,
SelfLink: "",
ServiceAccounts: [],
Status: "",
StatusMessage: "",
Tags: nil,
Zone: "",
ServerResponse: {HTTPStatusCode: 0,
Header: {}},
ForceSendFields: [],
NullFields: []},
Metadata: {},
Scopes: [],
StartupScript: "",
Project: "",
Zone: "",
NoCleanup: false,
ExactName: false}
基本的に、私はGoogle Compute Engine API client libからインスタンス構造体を埋め込む構造体、のCreateInstanceを、持っています。 CreateInstanceには、JSONタグがないExactNameとNoCleanupの2つのboolフィールドもあります。
CreateInstanceをマーシャリングしようとすると、ExactNameとNoCleanupが省略され、trueまたはfalseになります。その型を埋め込むことによって、あなたはもちろん、出力にあなたのCreateInstance
構造体のフィールドのいずれかを行っていないcompute.Instance
からごCreateInstance
MarshalJSON
方法を、与える本質的にあるよう
ここは、遊び場の近似です。https://play.golang.org/p/9R9Yo8IemD期待どおりに動作します。 MarshalIndentはエラーを返しますか? –
良い近似。いいえ、MashalIndentはエラーを返しません。 –
したがって、私は現在、* CreateInstanceを渡しています。私はそれを逆参照すると、それは動作します。 –