refit icon indicating copy to clipboard operation
refit copied to clipboard

[Bug]: JsonPropertyName attribute is ignored (does not rename properties as expected)

Open 7amou3 opened this issue 2 years ago • 10 comments

Describe the bug 🐞

Hello the [JsonPropertyName("mycustomePropName")] doesn't seems to work, the serializer always output the property name, for example: in the DummyRequest class below, the url is:

http://localhost/myendpoint/json?All=True&Limit=10 instead of http://localhost/myendpoint/json?all=True&otherText=10

the [AliasAs("othertext")] works fine, but I don't want to use it Any Idea? Thanks

Step to reproduce

create a new .Net 7 project and paste the following code in program.cs

using System.ComponentModel;
using System.Text.Json.Serialization;
using Refit;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// Configure Refit
builder.Services
               .AddRefitClient<IGithubApi>()
               .ConfigureHttpClient(c =>
               {
                   c.BaseAddress = new Uri("http://localhost/");
               });

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

// Test client
var api = app.Services.GetService<IGithubApi>();
var res = api.GetContainers(new DummyRequest() { All = true, Limit = 10 });

app.Run();


public class DummyRequest
{
    [JsonPropertyName("all")]
    public bool All { get; set; } = true;

    
    [JsonPropertyName("otherText")]
    public int Limit { get; set; }
}

interface IGithubApi
{
    [Get("/myendpoint/json")]
    Task<Container> GetContainers(DummyRequest request);
}

Reproduction repository

https://github.com/reactiveui/refit

Expected behavior

Serialized properties that have the [JsonPropertyName("myPropName")] should be renamed accordingly

Screenshots 🖼️

bellow the sent request https://i.imgur.com/hJkiH3a.png

IDE

Visual Studio 2022

Operating system

Windows

Version

11

Device

No response

Refit Version

7.0.0

Additional information ℹ️

No response

7amou3 avatar Jul 20 '23 13:07 7amou3

Hello, any help?

7amou3 avatar Jul 23 '23 11:07 7amou3

@7amou3 it's not a bug, it's by design, i've prepared pr, but i think it's odd to use JsonPropertyName for query params, do you have any reasons why you do not want to use AliasAs

sergeivalko avatar Jul 26 '23 00:07 sergeivalko

I don't want to use AliasAs Because I share a Nuget package that host the models, and I don't want the nuget to have a dependancy on refit

7amou3 avatar Jul 26 '23 09:07 7amou3

I'm running into the same issue where I want to remove Refit from my core package and reuse the models between my library which I want to support trimming and AOT and a child library which adds a Refit client separately. Supporting the JsonPropertyNameAttribute (or an alternative BCL included attribute) as a replacement for the AliasAsAttribute for query parameters would be helpful to not have my shared models depend on Refit references.

damidhagor avatar Jul 30 '23 00:07 damidhagor

@7amou3 @damidhagor oh i get it, i forgot about that case, PR still on review so we have to wait 😄

sergeivalko avatar Jul 31 '23 17:07 sergeivalko

@clairernovotny can you check and merge this fix please?

7amou3 avatar Aug 13 '23 18:08 7amou3

The issue arises because query strings aren't JSON and thus aren't processed in the same way as JSON serialization. While JSON serialization has its own conventions and rules, query strings follow a different set of standards and encoding mechanisms. The two are distinct and require different handling approaches.

tcortega avatar Sep 27 '23 20:09 tcortega

Any updates on this?

Thepriestdude avatar May 29 '24 15:05 Thepriestdude

Any updates on this?

You have to use the AliasAs attribute. Sadly the refit team has not reviewed my PR. https://github.com/reactiveui/refit?tab=readme-ov-file#api-attributes

GitHub
The automatic type-safe REST library for .NET Core, Xamarin and .NET. Heavily inspired by Square's Retrofit library, Refit turns your REST API into a live interface. - reactiveui/refit

tcortega avatar May 29 '24 15:05 tcortega

@tcortega, Question: Would it be possible to also add in support for using the formatters for bodies since they also ignore the [JsonPropertyName] attribute? Having one interface for both would cut down on the clutter.

Edit: There was an error with my code, please ignore

Thepriestdude avatar May 30 '24 07:05 Thepriestdude

@ChrisPulman this should be closed

tcortega avatar Jun 04 '24 20:06 tcortega

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

github-actions[bot] avatar Jul 05 '24 00:07 github-actions[bot]