Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for JSON #3007

Merged
merged 7 commits into from
Dec 15, 2022
Merged

Support for JSON #3007

merged 7 commits into from
Dec 15, 2022

Conversation

akutz
Copy link
Member

@akutz akutz commented Dec 12, 2022

Description

This patch adds support to GoVmomi for marshaling/unmarshaling the vim25/types (and other VMODL1 types) to/from JSON using:

  • a customized version of the Golang encoding/json package that relies upon
  • a new discriminator field added to every every complex object marshaled to JSON, the _typeName field. this field's value must match the value of the type's registered type name from the type registry

Additionally, in order to avoid creating a bespoke JSON codec package, it was necessary to essentially vendor the Golang encoding/json package and modify it to support this feature. However, changes were kept to a minimum, with discriminator support an explicit choice enabled on instances of Encoder and Decoder.

The diff between the vendored package and the source from Go 1.17.13 further serves to highlight how minimal the changes are:

C1="$(git log --pretty=format:'%h' --no-patch --grep='Vendor Go 1.17.13 encoding/json')" && \
C2="$(git log --pretty=format:'%h' --no-patch --grep='JSON Encoding w Discriminator Support')" && \
git diff "${C1}".."${C2}"

This is also a breaking change in that certain output from govc -json will now produce field names that are camelCase instead of PascalCase.

Closes: NA

Type of change

Please mark options that are relevant:

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to
    not work as expected)
  • This change requires a documentation update
  • Build related change

How Has This Been Tested?

$ go test -race -v -run JSON ./vim25/types
=== RUN   TestJSONMarshalVirtualMachineConfigSpec
--- PASS: TestJSONMarshalVirtualMachineConfigSpec (0.00s)
=== RUN   TestJSONUnmarshalVirtualMachineConfigSpec
--- PASS: TestJSONUnmarshalVirtualMachineConfigSpec (0.00s)
=== RUN   TestJSONUnmarshalVirtualMachineConfigInfo
--- PASS: TestJSONUnmarshalVirtualMachineConfigInfo (0.01s)
PASS
ok  	github.com/vmware/govmomi/vim25/types	0.194s
$ go test -race -v -run Discriminator ./vim25/json
=== RUN   TestDiscriminator
=== RUN   TestDiscriminator/Encode
=== RUN   TestDiscriminator/Encode/#00
=== RUN   TestDiscriminator/Encode/#01
=== RUN   TestDiscriminator/Encode/#02
=== RUN   TestDiscriminator/Encode/#03
=== RUN   TestDiscriminator/Encode/#04
=== RUN   TestDiscriminator/Encode/#05
=== RUN   TestDiscriminator/Encode/#06
=== RUN   TestDiscriminator/Encode/#07
=== RUN   TestDiscriminator/Encode/#08
=== RUN   TestDiscriminator/Encode/#09
=== RUN   TestDiscriminator/Encode/#10
=== RUN   TestDiscriminator/Encode/#11
=== RUN   TestDiscriminator/Encode/#12
=== RUN   TestDiscriminator/Encode/#13
=== RUN   TestDiscriminator/Encode/#14
=== RUN   TestDiscriminator/Encode/#15
=== RUN   TestDiscriminator/Encode/#16
=== RUN   TestDiscriminator/Encode/#17
=== RUN   TestDiscriminator/Encode/#18
=== RUN   TestDiscriminator/Encode/#19
=== RUN   TestDiscriminator/Encode/#20
=== RUN   TestDiscriminator/Encode/#21
=== RUN   TestDiscriminator/Encode/#22
=== RUN   TestDiscriminator/Encode/#23
=== RUN   TestDiscriminator/Encode/#24
=== RUN   TestDiscriminator/Encode/#25
=== RUN   TestDiscriminator/Encode/#26
=== RUN   TestDiscriminator/Encode/#27
=== RUN   TestDiscriminator/Encode/#28
=== RUN   TestDiscriminator/Encode/#29
=== RUN   TestDiscriminator/Encode/#30
=== RUN   TestDiscriminator/Encode/#31
=== RUN   TestDiscriminator/Encode/#32
=== RUN   TestDiscriminator/Encode/#33
=== RUN   TestDiscriminator/Encode/#34
=== RUN   TestDiscriminator/Encode/#35
=== RUN   TestDiscriminator/Encode/#36
=== RUN   TestDiscriminator/Encode/#37
=== RUN   TestDiscriminator/Encode/#38
=== RUN   TestDiscriminator/Encode/#39
=== RUN   TestDiscriminator/Encode/#40
=== RUN   TestDiscriminator/Encode/#41
=== RUN   TestDiscriminator/Encode/#42
=== RUN   TestDiscriminator/Encode/#43
=== RUN   TestDiscriminator/Encode/#44
=== RUN   TestDiscriminator/Encode/#45
=== RUN   TestDiscriminator/Encode/#46
=== RUN   TestDiscriminator/Encode/#47
=== RUN   TestDiscriminator/Encode/#48
=== RUN   TestDiscriminator/Encode/#49
=== RUN   TestDiscriminator/Encode/#50
=== RUN   TestDiscriminator/Encode/#51
=== RUN   TestDiscriminator/Encode/#52
=== RUN   TestDiscriminator/Encode/#53
=== RUN   TestDiscriminator/Encode/#54
=== RUN   TestDiscriminator/Encode/#55
=== RUN   TestDiscriminator/Encode/#56
=== RUN   TestDiscriminator/Encode/#57
=== RUN   TestDiscriminator/Encode/#58
=== RUN   TestDiscriminator/Encode/#59
=== RUN   TestDiscriminator/Encode/#60
=== RUN   TestDiscriminator/Encode/#61
=== RUN   TestDiscriminator/Encode/#62
=== RUN   TestDiscriminator/Encode/#63
=== RUN   TestDiscriminator/Encode/#64
=== RUN   TestDiscriminator/Encode/#65
=== RUN   TestDiscriminator/Encode/#66
=== RUN   TestDiscriminator/Encode/#67
=== RUN   TestDiscriminator/Encode/#68
=== RUN   TestDiscriminator/Encode/#69
=== RUN   TestDiscriminator/Encode/#70
=== RUN   TestDiscriminator/Encode/#71
=== RUN   TestDiscriminator/Encode/#72
=== RUN   TestDiscriminator/Encode/#73
=== RUN   TestDiscriminator/Encode/#74
=== RUN   TestDiscriminator/Encode/#75
=== RUN   TestDiscriminator/Encode/#76
=== RUN   TestDiscriminator/Encode/#77
=== RUN   TestDiscriminator/Encode/#78
=== RUN   TestDiscriminator/Encode/#79
=== RUN   TestDiscriminator/Encode/#80
=== RUN   TestDiscriminator/Encode/#81
=== RUN   TestDiscriminator/Encode/#82
=== RUN   TestDiscriminator/Encode/#83
=== RUN   TestDiscriminator/Encode/#84
=== RUN   TestDiscriminator/Encode/#85
=== RUN   TestDiscriminator/Encode/#86
=== RUN   TestDiscriminator/Encode/#87
=== RUN   TestDiscriminator/Encode/#88
=== RUN   TestDiscriminator/Encode/#89
=== RUN   TestDiscriminator/Encode/#90
=== RUN   TestDiscriminator/Encode/#91
=== RUN   TestDiscriminator/Encode/#92
=== RUN   TestDiscriminator/Encode/#93
=== RUN   TestDiscriminator/Encode/#94
=== RUN   TestDiscriminator/Encode/#95
=== RUN   TestDiscriminator/Decode
=== RUN   TestDiscriminator/Decode/#00
=== RUN   TestDiscriminator/Decode/#01
=== RUN   TestDiscriminator/Decode/#02
=== RUN   TestDiscriminator/Decode/#03
=== RUN   TestDiscriminator/Decode/#04
=== RUN   TestDiscriminator/Decode/#05
=== RUN   TestDiscriminator/Decode/#06
=== RUN   TestDiscriminator/Decode/#07
=== RUN   TestDiscriminator/Decode/#08
=== RUN   TestDiscriminator/Decode/#09
=== RUN   TestDiscriminator/Decode/#10
=== RUN   TestDiscriminator/Decode/#11
=== RUN   TestDiscriminator/Decode/#12
=== RUN   TestDiscriminator/Decode/#13
=== RUN   TestDiscriminator/Decode/#14
=== RUN   TestDiscriminator/Decode/#15
=== RUN   TestDiscriminator/Decode/#16
=== RUN   TestDiscriminator/Decode/#17
=== RUN   TestDiscriminator/Decode/#18
=== RUN   TestDiscriminator/Decode/#19
=== RUN   TestDiscriminator/Decode/#20
=== RUN   TestDiscriminator/Decode/#21
=== RUN   TestDiscriminator/Decode/#22
=== RUN   TestDiscriminator/Decode/#23
=== RUN   TestDiscriminator/Decode/#24
=== RUN   TestDiscriminator/Decode/#25
=== RUN   TestDiscriminator/Decode/#26
=== RUN   TestDiscriminator/Decode/#27
=== RUN   TestDiscriminator/Decode/#28
=== RUN   TestDiscriminator/Decode/#29
=== RUN   TestDiscriminator/Decode/#30
=== RUN   TestDiscriminator/Decode/#31
=== RUN   TestDiscriminator/Decode/#32
=== RUN   TestDiscriminator/Decode/#33
=== RUN   TestDiscriminator/Decode/#34
=== RUN   TestDiscriminator/Decode/#35
=== RUN   TestDiscriminator/Decode/#36
=== RUN   TestDiscriminator/Decode/#37
=== RUN   TestDiscriminator/Decode/#38
=== RUN   TestDiscriminator/Decode/#39
=== RUN   TestDiscriminator/Decode/#40
=== RUN   TestDiscriminator/Decode/#41
=== RUN   TestDiscriminator/Decode/#42
=== RUN   TestDiscriminator/Decode/#43
=== RUN   TestDiscriminator/Decode/#44
=== RUN   TestDiscriminator/Decode/#45
=== RUN   TestDiscriminator/Decode/#46
=== RUN   TestDiscriminator/Decode/#47
=== RUN   TestDiscriminator/Decode/#48
=== RUN   TestDiscriminator/Decode/#49
=== RUN   TestDiscriminator/Decode/#50
=== RUN   TestDiscriminator/Decode/#51
=== RUN   TestDiscriminator/Decode/#52
=== RUN   TestDiscriminator/Decode/#53
=== RUN   TestDiscriminator/Decode/#54
=== RUN   TestDiscriminator/Decode/#55
=== RUN   TestDiscriminator/Decode/#56
=== RUN   TestDiscriminator/Decode/#57
=== RUN   TestDiscriminator/Decode/#58
=== RUN   TestDiscriminator/Decode/#59
=== RUN   TestDiscriminator/Decode/#60
=== RUN   TestDiscriminator/Decode/#61
=== RUN   TestDiscriminator/Decode/#62
=== RUN   TestDiscriminator/Decode/#63
=== RUN   TestDiscriminator/Decode/#64
=== RUN   TestDiscriminator/Decode/#65
=== RUN   TestDiscriminator/Decode/#66
=== RUN   TestDiscriminator/Decode/#67
=== RUN   TestDiscriminator/Decode/#68
=== RUN   TestDiscriminator/Decode/#69
=== RUN   TestDiscriminator/Decode/#70
=== RUN   TestDiscriminator/Decode/#71
=== RUN   TestDiscriminator/Decode/#72
=== RUN   TestDiscriminator/Decode/#73
=== RUN   TestDiscriminator/Decode/#74
=== RUN   TestDiscriminator/Decode/#75
=== RUN   TestDiscriminator/Decode/#76
=== RUN   TestDiscriminator/Decode/#77
=== RUN   TestDiscriminator/Decode/#78
=== RUN   TestDiscriminator/Decode/#79
=== RUN   TestDiscriminator/Decode/#80
=== RUN   TestDiscriminator/Decode/#81
=== RUN   TestDiscriminator/Decode/#82
=== RUN   TestDiscriminator/Decode/#83
=== RUN   TestDiscriminator/Decode/#84
=== RUN   TestDiscriminator/Decode/#85
=== RUN   TestDiscriminator/Decode/#86
=== RUN   TestDiscriminator/Decode/#87
=== RUN   TestDiscriminator/Decode/#88
=== RUN   TestDiscriminator/Decode/#89
=== RUN   TestDiscriminator/Decode/#90
=== RUN   TestDiscriminator/Decode/#91
=== RUN   TestDiscriminator/Decode/#92
=== RUN   TestDiscriminator/Decode/#93
=== RUN   TestDiscriminator/Decode/#94
=== RUN   TestDiscriminator/Decode/#95
--- PASS: TestDiscriminator (0.02s)
    --- PASS: TestDiscriminator/Encode (0.01s)
        --- PASS: TestDiscriminator/Encode/#00 (0.00s)
        --- PASS: TestDiscriminator/Encode/#01 (0.00s)
        --- PASS: TestDiscriminator/Encode/#02 (0.00s)
        --- PASS: TestDiscriminator/Encode/#03 (0.00s)
        --- PASS: TestDiscriminator/Encode/#04 (0.00s)
        --- PASS: TestDiscriminator/Encode/#05 (0.00s)
        --- PASS: TestDiscriminator/Encode/#06 (0.00s)
        --- PASS: TestDiscriminator/Encode/#07 (0.00s)
        --- PASS: TestDiscriminator/Encode/#08 (0.00s)
        --- PASS: TestDiscriminator/Encode/#09 (0.00s)
        --- PASS: TestDiscriminator/Encode/#10 (0.00s)
        --- PASS: TestDiscriminator/Encode/#11 (0.00s)
        --- PASS: TestDiscriminator/Encode/#12 (0.00s)
        --- PASS: TestDiscriminator/Encode/#13 (0.00s)
        --- PASS: TestDiscriminator/Encode/#14 (0.00s)
        --- PASS: TestDiscriminator/Encode/#15 (0.00s)
        --- PASS: TestDiscriminator/Encode/#16 (0.00s)
        --- PASS: TestDiscriminator/Encode/#17 (0.00s)
        --- PASS: TestDiscriminator/Encode/#18 (0.00s)
        --- PASS: TestDiscriminator/Encode/#19 (0.00s)
        --- PASS: TestDiscriminator/Encode/#20 (0.00s)
        --- PASS: TestDiscriminator/Encode/#21 (0.00s)
        --- PASS: TestDiscriminator/Encode/#22 (0.00s)
        --- PASS: TestDiscriminator/Encode/#23 (0.00s)
        --- PASS: TestDiscriminator/Encode/#24 (0.00s)
        --- PASS: TestDiscriminator/Encode/#25 (0.00s)
        --- PASS: TestDiscriminator/Encode/#26 (0.00s)
        --- PASS: TestDiscriminator/Encode/#27 (0.00s)
        --- PASS: TestDiscriminator/Encode/#28 (0.00s)
        --- PASS: TestDiscriminator/Encode/#29 (0.00s)
        --- PASS: TestDiscriminator/Encode/#30 (0.00s)
        --- PASS: TestDiscriminator/Encode/#31 (0.00s)
        --- PASS: TestDiscriminator/Encode/#32 (0.00s)
        --- PASS: TestDiscriminator/Encode/#33 (0.00s)
        --- PASS: TestDiscriminator/Encode/#34 (0.00s)
        --- PASS: TestDiscriminator/Encode/#35 (0.00s)
        --- PASS: TestDiscriminator/Encode/#36 (0.00s)
        --- PASS: TestDiscriminator/Encode/#37 (0.00s)
        --- PASS: TestDiscriminator/Encode/#38 (0.00s)
        --- PASS: TestDiscriminator/Encode/#39 (0.00s)
        --- PASS: TestDiscriminator/Encode/#40 (0.00s)
        --- PASS: TestDiscriminator/Encode/#41 (0.00s)
        --- PASS: TestDiscriminator/Encode/#42 (0.00s)
        --- PASS: TestDiscriminator/Encode/#43 (0.00s)
        --- PASS: TestDiscriminator/Encode/#44 (0.00s)
        --- PASS: TestDiscriminator/Encode/#45 (0.00s)
        --- PASS: TestDiscriminator/Encode/#46 (0.00s)
        --- PASS: TestDiscriminator/Encode/#47 (0.00s)
        --- PASS: TestDiscriminator/Encode/#48 (0.00s)
        --- PASS: TestDiscriminator/Encode/#49 (0.00s)
        --- PASS: TestDiscriminator/Encode/#50 (0.00s)
        --- PASS: TestDiscriminator/Encode/#51 (0.00s)
        --- PASS: TestDiscriminator/Encode/#52 (0.00s)
        --- PASS: TestDiscriminator/Encode/#53 (0.00s)
        --- PASS: TestDiscriminator/Encode/#54 (0.00s)
        --- PASS: TestDiscriminator/Encode/#55 (0.00s)
        --- PASS: TestDiscriminator/Encode/#56 (0.00s)
        --- PASS: TestDiscriminator/Encode/#57 (0.00s)
        --- PASS: TestDiscriminator/Encode/#58 (0.00s)
        --- PASS: TestDiscriminator/Encode/#59 (0.00s)
        --- PASS: TestDiscriminator/Encode/#60 (0.00s)
        --- PASS: TestDiscriminator/Encode/#61 (0.00s)
        --- PASS: TestDiscriminator/Encode/#62 (0.00s)
        --- PASS: TestDiscriminator/Encode/#63 (0.00s)
        --- PASS: TestDiscriminator/Encode/#64 (0.00s)
        --- PASS: TestDiscriminator/Encode/#65 (0.00s)
        --- PASS: TestDiscriminator/Encode/#66 (0.00s)
        --- PASS: TestDiscriminator/Encode/#67 (0.00s)
        --- PASS: TestDiscriminator/Encode/#68 (0.00s)
        --- PASS: TestDiscriminator/Encode/#69 (0.00s)
        --- PASS: TestDiscriminator/Encode/#70 (0.00s)
        --- PASS: TestDiscriminator/Encode/#71 (0.00s)
        --- PASS: TestDiscriminator/Encode/#72 (0.00s)
        --- PASS: TestDiscriminator/Encode/#73 (0.00s)
        --- PASS: TestDiscriminator/Encode/#74 (0.00s)
        --- PASS: TestDiscriminator/Encode/#75 (0.00s)
        --- PASS: TestDiscriminator/Encode/#76 (0.00s)
        --- PASS: TestDiscriminator/Encode/#77 (0.00s)
        --- PASS: TestDiscriminator/Encode/#78 (0.00s)
        --- PASS: TestDiscriminator/Encode/#79 (0.00s)
        --- PASS: TestDiscriminator/Encode/#80 (0.00s)
        --- PASS: TestDiscriminator/Encode/#81 (0.00s)
        --- PASS: TestDiscriminator/Encode/#82 (0.00s)
        --- PASS: TestDiscriminator/Encode/#83 (0.00s)
        --- PASS: TestDiscriminator/Encode/#84 (0.00s)
        --- PASS: TestDiscriminator/Encode/#85 (0.00s)
        --- PASS: TestDiscriminator/Encode/#86 (0.00s)
        --- PASS: TestDiscriminator/Encode/#87 (0.00s)
        --- PASS: TestDiscriminator/Encode/#88 (0.00s)
        --- PASS: TestDiscriminator/Encode/#89 (0.00s)
        --- PASS: TestDiscriminator/Encode/#90 (0.00s)
        --- PASS: TestDiscriminator/Encode/#91 (0.00s)
        --- PASS: TestDiscriminator/Encode/#92 (0.00s)
        --- PASS: TestDiscriminator/Encode/#93 (0.00s)
        --- PASS: TestDiscriminator/Encode/#94 (0.00s)
        --- PASS: TestDiscriminator/Encode/#95 (0.00s)
    --- PASS: TestDiscriminator/Decode (0.01s)
        --- PASS: TestDiscriminator/Decode/#00 (0.00s)
        --- PASS: TestDiscriminator/Decode/#01 (0.00s)
        --- PASS: TestDiscriminator/Decode/#02 (0.00s)
        --- PASS: TestDiscriminator/Decode/#03 (0.00s)
        --- PASS: TestDiscriminator/Decode/#04 (0.00s)
        --- PASS: TestDiscriminator/Decode/#05 (0.00s)
        --- PASS: TestDiscriminator/Decode/#06 (0.00s)
        --- PASS: TestDiscriminator/Decode/#07 (0.00s)
        --- PASS: TestDiscriminator/Decode/#08 (0.00s)
        --- PASS: TestDiscriminator/Decode/#09 (0.00s)
        --- PASS: TestDiscriminator/Decode/#10 (0.00s)
        --- PASS: TestDiscriminator/Decode/#11 (0.00s)
        --- PASS: TestDiscriminator/Decode/#12 (0.00s)
        --- PASS: TestDiscriminator/Decode/#13 (0.00s)
        --- PASS: TestDiscriminator/Decode/#14 (0.00s)
        --- PASS: TestDiscriminator/Decode/#15 (0.00s)
        --- PASS: TestDiscriminator/Decode/#16 (0.00s)
        --- PASS: TestDiscriminator/Decode/#17 (0.00s)
        --- PASS: TestDiscriminator/Decode/#18 (0.00s)
        --- PASS: TestDiscriminator/Decode/#19 (0.00s)
        --- PASS: TestDiscriminator/Decode/#20 (0.00s)
        --- PASS: TestDiscriminator/Decode/#21 (0.00s)
        --- PASS: TestDiscriminator/Decode/#22 (0.00s)
        --- PASS: TestDiscriminator/Decode/#23 (0.00s)
        --- PASS: TestDiscriminator/Decode/#24 (0.00s)
        --- PASS: TestDiscriminator/Decode/#25 (0.00s)
        --- PASS: TestDiscriminator/Decode/#26 (0.00s)
        --- PASS: TestDiscriminator/Decode/#27 (0.00s)
        --- PASS: TestDiscriminator/Decode/#28 (0.00s)
        --- PASS: TestDiscriminator/Decode/#29 (0.00s)
        --- PASS: TestDiscriminator/Decode/#30 (0.00s)
        --- PASS: TestDiscriminator/Decode/#31 (0.00s)
        --- PASS: TestDiscriminator/Decode/#32 (0.00s)
        --- PASS: TestDiscriminator/Decode/#33 (0.00s)
        --- PASS: TestDiscriminator/Decode/#34 (0.00s)
        --- PASS: TestDiscriminator/Decode/#35 (0.00s)
        --- PASS: TestDiscriminator/Decode/#36 (0.00s)
        --- PASS: TestDiscriminator/Decode/#37 (0.00s)
        --- PASS: TestDiscriminator/Decode/#38 (0.00s)
        --- PASS: TestDiscriminator/Decode/#39 (0.00s)
        --- PASS: TestDiscriminator/Decode/#40 (0.00s)
        --- PASS: TestDiscriminator/Decode/#41 (0.00s)
        --- PASS: TestDiscriminator/Decode/#42 (0.00s)
        --- PASS: TestDiscriminator/Decode/#43 (0.00s)
        --- PASS: TestDiscriminator/Decode/#44 (0.00s)
        --- PASS: TestDiscriminator/Decode/#45 (0.00s)
        --- PASS: TestDiscriminator/Decode/#46 (0.00s)
        --- PASS: TestDiscriminator/Decode/#47 (0.00s)
        --- PASS: TestDiscriminator/Decode/#48 (0.00s)
        --- PASS: TestDiscriminator/Decode/#49 (0.00s)
        --- PASS: TestDiscriminator/Decode/#50 (0.00s)
        --- PASS: TestDiscriminator/Decode/#51 (0.00s)
        --- PASS: TestDiscriminator/Decode/#52 (0.00s)
        --- PASS: TestDiscriminator/Decode/#53 (0.00s)
        --- PASS: TestDiscriminator/Decode/#54 (0.00s)
        --- PASS: TestDiscriminator/Decode/#55 (0.00s)
        --- PASS: TestDiscriminator/Decode/#56 (0.00s)
        --- PASS: TestDiscriminator/Decode/#57 (0.00s)
        --- PASS: TestDiscriminator/Decode/#58 (0.00s)
        --- PASS: TestDiscriminator/Decode/#59 (0.00s)
        --- PASS: TestDiscriminator/Decode/#60 (0.00s)
        --- PASS: TestDiscriminator/Decode/#61 (0.00s)
        --- PASS: TestDiscriminator/Decode/#62 (0.00s)
        --- PASS: TestDiscriminator/Decode/#63 (0.00s)
        --- PASS: TestDiscriminator/Decode/#64 (0.00s)
        --- PASS: TestDiscriminator/Decode/#65 (0.00s)
        --- PASS: TestDiscriminator/Decode/#66 (0.00s)
        --- PASS: TestDiscriminator/Decode/#67 (0.00s)
        --- PASS: TestDiscriminator/Decode/#68 (0.00s)
        --- PASS: TestDiscriminator/Decode/#69 (0.00s)
        --- PASS: TestDiscriminator/Decode/#70 (0.00s)
        --- PASS: TestDiscriminator/Decode/#71 (0.00s)
        --- PASS: TestDiscriminator/Decode/#72 (0.00s)
        --- PASS: TestDiscriminator/Decode/#73 (0.00s)
        --- PASS: TestDiscriminator/Decode/#74 (0.00s)
        --- PASS: TestDiscriminator/Decode/#75 (0.00s)
        --- PASS: TestDiscriminator/Decode/#76 (0.00s)
        --- PASS: TestDiscriminator/Decode/#77 (0.00s)
        --- PASS: TestDiscriminator/Decode/#78 (0.00s)
        --- PASS: TestDiscriminator/Decode/#79 (0.00s)
        --- PASS: TestDiscriminator/Decode/#80 (0.00s)
        --- PASS: TestDiscriminator/Decode/#81 (0.00s)
        --- PASS: TestDiscriminator/Decode/#82 (0.00s)
        --- PASS: TestDiscriminator/Decode/#83 (0.00s)
        --- PASS: TestDiscriminator/Decode/#84 (0.00s)
        --- PASS: TestDiscriminator/Decode/#85 (0.00s)
        --- PASS: TestDiscriminator/Decode/#86 (0.00s)
        --- PASS: TestDiscriminator/Decode/#87 (0.00s)
        --- PASS: TestDiscriminator/Decode/#88 (0.00s)
        --- PASS: TestDiscriminator/Decode/#89 (0.00s)
        --- PASS: TestDiscriminator/Decode/#90 (0.00s)
        --- PASS: TestDiscriminator/Decode/#91 (0.00s)
        --- PASS: TestDiscriminator/Decode/#92 (0.00s)
        --- PASS: TestDiscriminator/Decode/#93 (0.00s)
        --- PASS: TestDiscriminator/Decode/#94 (0.00s)
        --- PASS: TestDiscriminator/Decode/#95 (0.00s)
PASS
ok  	github.com/vmware/govmomi/vim25/json	0.175s

Checklist:

  • My code follows the CONTRIBUTION guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged

@akutz akutz force-pushed the feature/json-support branch 16 times, most recently from 49d7971 to 2e7fa94 Compare December 13, 2022 16:00
This patch vendors the sources from Go 1.17.13's encoding/json
package in the package vim25/json.
@akutz akutz force-pushed the feature/json-support branch 5 times, most recently from 3d75698 to a3d5553 Compare December 15, 2022 04:03
This patch introduces support for discriminators to the "encoding/json" package.
A discriminator is a field in a JSON object that indicates the object's type.
For example:

        {
            "breed": "Lab"
        }

The above JSON does not indicate the Go type into which the object should be
decoded. However, it is possible to store that Go type information along with
the JSON:

        {
            "_typeName": "Dog",
            "breed": "Lab"
        }

The "_typeName" field teaches the JSON decoder to unmarshal the object into the
Go type named "Dog".

This patch introduces functions for the json.Encoder and json.Decoder that may
be used to active support for discriminators.
This patch adds Go's LICENSE file to the vendored JSON package.
This patch adds a README to the vendored JSON package describing
its purpose and how to show the diff between the original sources
and the patch applied to the vendored copy.
This patch excludes the vendored vim25/json package from the
GitHub action that checks code style for Go sources.
@akutz akutz force-pushed the feature/json-support branch 3 times, most recently from b1e2692 to b7c16c1 Compare December 15, 2022 06:44
Copy link
Member

@dougm dougm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, thanks @akutz! lgtm.
One request (can be this PR or the mo json case follow up) is to include breaking: in one of the commits, so the release notes includes the json case change that'll impact govc -json based automation.

vim25/types/json_test.go Show resolved Hide resolved
This patch updates the type generation code to support adding
JSON tags to generated type field data.

BREAKING:

Updating the `vim25/types` with camelCased, JSON tags affects
the output of the `govc` command when using the `-json` flag
to emit results as JSON. Field names that used to be PascalCased
will now be camelCased. Queries for tools that parse JSON, such
as `jq`, will need to be updated to use the new camelCased fields.
This patch adds support to GoVmomi for marshaling/unmarshaling
the vim25/types (and other VMODL1 types) to/from JSON using:

* a customized version of the Golang encoding/json package that
  relies upon...
* a new discriminator field added to every every complex object
  marshaled to JSON, the "_typeName" field. this field's value
  must match the value of the type's registered type name from
  the type registry
@akutz akutz merged commit aca02ac into vmware:master Dec 15, 2022
@akutz akutz deleted the feature/json-support branch December 15, 2022 18:31
dougm added a commit to dougm/govmomi that referenced this pull request Sep 25, 2023
dougm added a commit to dougm/govmomi that referenced this pull request Sep 25, 2023
dougm added a commit that referenced this pull request Sep 27, 2023
dougm added a commit that referenced this pull request Sep 27, 2023
dougm added a commit to dougm/govmomi that referenced this pull request Sep 27, 2023
PR vmware#3007 added camelCase json tags for generated types
BREAKING: This change adds camelCase (lower-case 1st character) json tags for govc types

Fixes vmware#3243
Fixes vmware#3242
Fixes vmware#3241
dougm added a commit to dougm/govmomi that referenced this pull request Sep 27, 2023
PR vmware#3007 added camelCase json tags for generated types
BREAKING: This change adds camelCase (lower-case 1st character) json tags for govc types

Fixes vmware#3243
Fixes vmware#3242
Fixes vmware#3241
dougm added a commit to dougm/govmomi that referenced this pull request Sep 27, 2023
PR vmware#3007 added camelCase json tags for generated types
BREAKING: This change adds camelCase (lower-case 1st character) json tags for govc types

Fixes vmware#3243
Fixes vmware#3242
Fixes vmware#3241
priyanka19-98 pushed a commit to priyanka19-98/govmomi that referenced this pull request Jan 17, 2024
priyanka19-98 pushed a commit to priyanka19-98/govmomi that referenced this pull request Jan 17, 2024
priyanka19-98 pushed a commit to priyanka19-98/govmomi that referenced this pull request Jan 17, 2024
PR vmware#3007 added camelCase json tags for generated types
BREAKING: This change adds camelCase (lower-case 1st character) json tags for govc types

Fixes vmware#3243
Fixes vmware#3242
Fixes vmware#3241
dougm added a commit to dougm/govmomi that referenced this pull request Feb 8, 2024
BREAKING: follow up to json tags missed in PR vmware#3007 and PR vmware#3247

Closes vmware#3318
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants