encoding icon indicating copy to clipboard operation
encoding copied to clipboard

Cannot unmarshal string number value to json.Number

Open sattellite opened this issue 1 year ago • 0 comments

If a number is passed in string form, I catch a conversion error. I remember exactly that there was no such problem a few months ago, but now this problem has appeared.

package main

import (
	jsonStd "encoding/json"
	"fmt"

	"github.com/segmentio/encoding/json"
)

type eventStd struct {
	ID jsonStd.Number `json:"id"`
}

type event struct {
	ID json.Number `json:"id"`
}

func main() {
	data1 := []byte(`{"id":151}`)
	data2 := []byte(`{"id":"151"}`)

	var event1, event2 event
	err1 := json.Unmarshal(data1, &event1)
	err2 := json.Unmarshal(data2, &event2)
	fmt.Printf("segmentio:\n%+v, %+v\n", event1, err1)
	fmt.Printf("segmentio:\n%+v, %+v\n", event2, err2)

	var event3, event4 eventStd
	err3 := jsonStd.Unmarshal(data1, &event3)
	err4 := jsonStd.Unmarshal(data2, &event4)
	fmt.Printf("stdlib:\n%+v, %+v\n", event3, err3)
	fmt.Printf("stdlib:\n%+v, %+v\n", event4, err4)
}

Output:

segmentio:
{ID:151}, <nil>
segmentio:
{ID:}, json: cannot unmarshal "\"151\"}" into Go struct field main.event.id of type json.Number
stdlib:
{ID:151}, <nil>
stdlib:
{ID:151}, <nil>

This example in executable form https://go.dev/play/p/_ZilgKjQYwL

sattellite avatar Oct 21 '24 16:10 sattellite