如何在.Net 6中使用System.Text.Json进行序列化时忽略JsonPropertyName

31moq8wy  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(169)

我在. NET 6中使用System.Text.Json,我有一些数据类的属性用JsonPropertyName注解,以便能够与另一个API通信,但现在我需要使用原始属性名称,因为另一个商业原因,我正在寻找一种方法,使序列化程序忽略这些注解,并使用实际的属性名称。我发现在Newtonsoft中,我可以使用ContractResolver来完成建议的here,但我在System.Text.Json中找不到替代品。现在我正在考虑使用DTO来实现这一点,但我正在寻找一个更简单的解决方案,如果它可用。
这里有一个简单的例子,假设我们有这个Account类:

public class Account {
    [JsonPropertyName("fname")]
    public string FirstName { get; set; }
    [JsonPropertyName("lname")]
    public string LastName { get; set; }
    [JsonPropertyName("years_old")]
    public int Age {get; set; }
}

在一个使用中,我希望发送的响应格式如下:

{
    "fname": "John",
    "lname": "Doe",
    "years_old": 25
}

在另一个答案中,我需要:

{
    "firstname": "John",
    "lastname": "Doe",
    "age": 25
}

现在这只是一个示例,但是我的实际类有很多属性,并且不是为每个用例制作DTO是太多的工作。因此,为什么我正在寻找一个解决方案,使用像Newtonsoft DefaultContractResolver,但使用System.Text.Json
PS:我不能再搬回Newtonsoft.Json了。

olmpazwi

olmpazwi1#

如果你不想使用Map器和dto,我认为唯一的方法(我认为这是更有效的)

var origJson = @"{
    ""fname"": ""John"",
    ""lname"": ""Doe"",
    ""years_old"": 25
}";

    var fixedJson = FixPropertyNames(origJson);

public string FixPropertyNames(string json)
{
    StringBuilder sb = new StringBuilder(json);

    sb.Replace("\"fname\"", "\"firstname\"");
    sb.Replace("\"lname\"", "\"lastname\"");
    sb.Replace("\"years_old\"", "\"age\"");

    return sb.ToString();
}

或者如果你的类很小,你可以删除字符串生成器,把所有代码放在一行中。

fixedJson= origJson.Replace("\"fname\"", "\"firstname\"").Replace("\"lname\"", "\"lastname\"").Replace("\"years_old\"", "\"age\"");

我想您的API应该返回内容,因为您已经创建了一个json字符串

return Content(jsonString, "application/json");

相关问题