Description
Is your feature request related to a problem? Please describe.
Stripe.NET takes a hard dependency on the Netwonsoft.Json serializer which is fine for some cases. Starting with ASP.NET Core 3.0, the default JSON serializer has changed to System.Text.JSON.
For ASP.NET Core applications running on v3.0+ that use our Stripe.NET nuget package, developers have to be concerned with the inconsistencies between the serializers when working with Stripe Objects like Products, Customers, etc.
Serialized single Stripe Product w/ Newtonsoft
{
"object": "product",
"active": true,
"attributes": [],
"caption": null,
"created": 1650997792,
"deactivate_on": null,
"default_price": null,
"description": "This is such an awesome product made out of Metal",
"images": [
"https://picsum.photos/640/480/?image=279"
],
"livemode": false,
"metadata": {
"code": "XXFYF3V"
},
"name": "Gorgeous Plastic Pants",
"package_dimensions": null,
"shippable": true,
"statement_descriptor": null,
"tax_code": null,
"type": "service",
"unit_label": null,
"updated": 1650997792,
"url": null
}
Serialized single Stripe Product w/ System.Text.Json
{
"Object": "product",
"Active": true,
"Attributes": [],
"Caption": null,
"Created": "2022-04-26T18:29:52Z",
"DeactivateOn": null,
"DefaultPriceId": null,
"DefaultPrice": null,
"Deleted": null,
"Description": "This is such an awesome product made out of Metal",
"Images": [
"https://picsum.photos/640/480/?image=279"
],
"Livemode": false,
"Metadata": {
"code": "XXFYF3V"
},
"Name": "Gorgeous Plastic Pants",
"PackageDimensions": null,
"Shippable": true,
"StatementDescriptor": null,
"TaxCodeId": null,
"TaxCode": null,
"Type": "service",
"UnitLabel": null,
"Updated": "2022-04-26T18:29:52Z",
"Url": null,
"RawJObject": null,
"StripeResponse": null
}
You'll notice that the expected casing is different as well as the number of returned properties. Below are examples of serializing a StripeList
Serialized StripeList of Product w/ Newtonsoft.Json
{
"object": "list",
"data": [
{
"id": "prod_La3FD0M3LXeUPE",
"object": "product",
"active": true,
"attributes": [],
"caption": null,
"created": 1650997792,
"deactivate_on": null,
"default_price": null,
"description": "This is such an awesome product made out of Metal",
"images": [
"https://picsum.photos/640/480/?image=279"
],
"livemode": false,
"metadata": {
"code": "XXFYF3V"
},
"name": "Gorgeous Plastic Pants",
"package_dimensions": null,
"shippable": true,
"statement_descriptor": null,
...
],
"has_more": true,
"url": "/v1/products"
}
Serialized StripeList of Product w/ System.text.json
[
{
"Id": "prod_La3FD0M3LXeUPE",
"Object": "product",
"Active": true,
"Attributes": [],
"Caption": null,
"Created": "2022-04-26T18:29:52Z",
"DeactivateOn": null,
"DefaultPriceId": null,
"DefaultPrice": null,
"Deleted": null,
"Description": "This is such an awesome product made out of Metal",
"Images": [
"https://picsum.photos/640/480/?image=279"
],
"Livemode": false,
"Metadata": {
"code": "XXFYF3V"
},
"Name": "Gorgeous Plastic Pants",
"PackageDimensions": null,
"Shippable": true,
"StatementDescriptor": null,
...
"RawJObject": null,
"StripeResponse": null
}
]
With lists you can see the data nesting between the serializers are also different.
Describe the solution you'd like
Since System.Text.JSON is the default serializer for asp.net core web applications, It would be great if there could be some consistency with the expected responses when serializing/deserializing Stripe.NET object.
Can we have Stripe.NET use System.Text.JSON if available and fallback to Newtonsoft.JSON? Otherwise, I've seen other package authors create separate packages for each serializer but I'm not sure if we'd want to do that here.
Describe alternatives you've considered
This can be mitigated by using the setting Newtonsoft.Json as the default serializer by using the Microsoft.AspNetCore.Mvc.NewtonsoftJson package.
Another option would be to return a custom response type instead of the plain Stripe object. For example, see here.
Additional context
No response
Activity