Skip to content

encoding/json: invalid use of ,string struct tag, trying to unmarshal "" into int #41731

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

Closed
andig opened this issue Oct 1, 2020 · 3 comments
Closed
Labels
FrozenDueToAge WaitingForInfo Issue is not actionable because of missing required information, which needs to be provided.

Comments

@andig
Copy link
Contributor

andig commented Oct 1, 2020

What version of Go are you using (go version)?

$ go version
latest (playground)

Does this issue reproduce with the latest release?

yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
playground

What did you do?

Unmarshal json (https://play.golang.org/p/Ka8kdddUHKu):

s := struct{
	Val int `json:",string,omitempty"`
}{}

println(json.Unmarshal([]byte(`{"val":""}`), &s))

What did you expect to see?

Since val is "", the error as such is expected, however I would expect the omitempty to make a difference and hence return nil error. According to https://golang.org/pkg/encoding/json/:

The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string.

What did you see instead?

Error: invalid use of ,string struct tag, trying to unmarshal "" into int

Reasoning

To give flexibility in handling external json input it is preferable to handle the omitempty tag before handling further validations like string. In this case the order seems to be different.

If effect, ,string,omitempty should allow "" to be unmarshaled into numeric zero values.

UPDATE I realize this might indeed be more a proposal as omitempty seems to be documented and take effect only for marshaling but not unmarshaling.

@mvdan
Copy link
Member

mvdan commented Oct 1, 2020

Indeed, omitempty only affects marsaling, not unmarshaling. I think making it also affect unmarshaling is likely a breaking change, because right now unmarshaling an empty string with string `json:",omitempty"` sets the destination to "", whereas with your proposal we would not modify the value at all.

@andybons
Copy link
Member

andybons commented Oct 1, 2020

@andig if you’d like this to be a proposal, could you update the first comment and subject accordingly? See https://golang.org/s/proposal for more info. Thanks!

@andybons andybons added the WaitingForInfo Issue is not actionable because of missing required information, which needs to be provided. label Oct 1, 2020
@andig
Copy link
Contributor Author

andig commented Oct 2, 2020

Closing this one. I feel the scope I'm asking about is much too narrow for a proper proposal. A proposal if any should consider a wider range of encoding (and potentially decoding) issues.

@andig andig closed this as completed Oct 2, 2020
@golang golang locked and limited conversation to collaborators Oct 2, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
FrozenDueToAge WaitingForInfo Issue is not actionable because of missing required information, which needs to be provided.
Projects
None yet
Development

No branches or pull requests

4 participants