-
Notifications
You must be signed in to change notification settings - Fork 594
refactor(general): omitzero JSON tag
#4907
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
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR refactors JSON struct tags across multiple files by replacing omitempty with omitzero for fields where omitempty was ineffective. The change targets struct-typed fields (object.ID, StorageUsageDetails, epoch.Parameters) and time-related types (time.Time, jsonencoding.Duration) where the zero value needs explicit handling during JSON serialization.
Key Changes:
- Replaced
omitemptywithomitzerofor struct fields and time types where zero-value omission is intended - Removed
omitemptyentirely for struct fields where serialization should always occur
Reviewed Changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| snapshot/manifest.go | Updated JSON tags for ObjectID (struct) and storage stat fields to remove ineffective omitempty |
| repo/object/indirect.go | Removed omitempty from Object field (struct type) |
| repo/format/upgrade_lock_intent.go | Changed CreationTime from omitempty to omitzero for proper time.Time handling |
| repo/format/content_format.go | Changed EpochParameters from omitempty to omitzero for struct field |
| repo/blob/rclone/rclone_options.go | Changed StartupTimeout from omitempty to omitzero for Duration type |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #4907 +/- ##
==========================================
+ Coverage 75.86% 77.94% +2.07%
==========================================
Files 470 537 +67
Lines 37301 31205 -6096
==========================================
- Hits 28299 24323 -3976
+ Misses 7071 4838 -2233
- Partials 1931 2044 +113 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
The `omitempty` JSON tag is ineffective for fields of type `Time` and `Duration`. Also, this struct is only used during the "upgrade" protocol, and it is OK to explicitly serialize 0 values, as it was being done.
The `omitempty` JSON tag is ineffective on fields of struct type, among others. The fields with tags changed from `omitempty` to `omitzero` can be classified into 2 categories: - fields for which the intent was to avoid serializing the value when it was zero or empty (such as structs with the zero value for the struct); - policy-definition fields that have the `omitempty` to match the corresponding policy fields. The fields are changed such that - the fields are not serialized when they have the zero (or empty) value; and - consistency is maintained between policy fields and the corresponding policy definition fields. --- In the context of policy definitions: **Fields of type `struct`**: In some cases, the fields in the policy definition and values are of type struct, such as is the case for the `policy.Policy` and `policy.Definition` structs. In these cases, the `omitzero` JSON tag avoids marshaling empty fields, making the serialized representation more compact and less noisy, while preserving the same behavior and thus semantic when unmarshaling omitted fields. **Fields of pointer types**: The `omitempty` and `omitzero` have _practically_ the same effect on fields of pointer types: - the field is omitted when it is null - the field is included when it is not null, even if the value that it points to is "the zero value" for the non-pointer type. Note: when the pointer type defines an `IsZero()` member function, then that field would also be omitted during marshaling. There are no defined `IsZero()` function for these pointers, so the semantics are preserved in this case. The `omitzero` JSON tag in the fields definition structs, such as the `ActionPolicyDefinition struct`, does not change the semantics, it simply makes the marshaled representation more compact. **Fields of type slice**: The behavior for `omitempty` and `omitzero` differs for slices, and maps as well. The struct fields of slice type, such as `[]string`, are left with the `omitempty` tag to be able to tell the difference between a nil slice and a non-nil, zero-length slice. Even though, currently most code paths do not explicitly differentiate between a nil slice and an empty slice, the `omitempty` tag is left unmodified out of abundance of caution. --- Ref: - #4973 - #4907
Replaces ineffective
omitemptyJSON tag in various fields of typetime.Timetime.DurationstructThe original intent was to avoid serializing these fields when they were "empty", however
omitemptyhas no effect on fields that are structs.