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

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

Closed
andig opened this issue Oct 1, 2020 · 3 comments
Closed

Comments

@andig
Copy link
Contributor

@andig 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 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 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!

@andig
Copy link
Contributor Author

@andig 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 Oct 2, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
3 participants
You can’t perform that action at this time.