stripe-go icon indicating copy to clipboard operation
stripe-go copied to clipboard

Support bidirectional marshalling/unmarshalling

Open nghtstr opened this issue 4 years ago • 2 comments

When I get a customer, and expand the sources; if the source is of type Source, it does not json.Marshal correctly. Here is some basic code demonstrating that the code should work as expected:

func (h *Handle) getStripeCustomer(user *netauth.User) *stripe.Customer {
	stripe.Key = h.Options.Stripe.Key
	custID := user.Detail.Stripe // Customer ID as stored in the DB

	params := &stripe.CustomerParams{}
	params.AddExpand("sources")
	params.AddExpand("sources.data")
	params.AddExpand("sources.data.source")
	c, _ := customer.Get(custID, params)
	out, _ := json.MarshalIndent(c, "", "  ")
	fmt.Printf("List: ", string(out))

	testSource := "src_1HXWUoDEks681qEQ2rMI3gWJ" // This is a Stripe test card
	s, _ := source.Get(
		testSource,
		nil,
	)
	fmt.Printf("%+v\n", c.Sources)
	for _, src := range c.Sources.Data {
		fmt.Printf("%+v\n", src.SourceObject)
	}
	out, _ = json.MarshalIndent(s, "", "  ")
	fmt.Printf("Source: ", string(out))

	return c
}

The array of customer.Sources.Data does give the appropriate SourceObject but it does not json.Marshal correctly.

nghtstr avatar Oct 06 '20 01:10 nghtstr

Hey @nghtstr, we don't currently guarantee that the data structures in stripe-go marshal and unmarshal bidirectionally like you might expect. Most of them do, but there's a few places where structures need some pretty edgy custom UnmarshalJSON implementations to work correctly, and sources are an example of that:

https://github.com/stripe/stripe-go/blob/6bbf08329864a94a53a1583e52b859bea05e57b2/source.go#L333-L353

If you want to store Stripe data somewhere, we'd recommend mapping the stripe-go structures to your own internal variant of such — that way you have full control over how marshaling and unmarshaling works, and won't be broken by any future changes that we might make.

brandur-stripe avatar Oct 06 '20 18:10 brandur-stripe

Per some internal discussion, bidirectional marshalling/unmarshalling would be a nice-to-have, so I'm rebranding this as a feature request.

richardm-stripe avatar Oct 13 '20 17:10 richardm-stripe