【问题标题】:ASP.NET Core 3.1 web API JSON response camelizes more than first characterASP.NET Core 3.1 Web API JSON 响应骆驼化超过第一个字符
【发布时间】:2020-12-22 11:21:42
【问题描述】:

在我们的 Web API 中,我们有具有缩写名称的旧实体。我们还通过 T4 模板使用代码生成,我们希望让事情保持简单和可预测:

  • 模板创建 C# 类并将属性的第一个字符大写
  • 模板创建 Angular 代码并将属性的第一个字符小写

然而,来自 Web API 的 JSON 响应在决定将哪些字母转换为小写而不是仅预期的第一个字符方面发挥了一些作用。

例如,在 Visual Studio 中启动新的默认 Web API 并向WeatherForecast.cs 添加两个属性时:

public string TSTValue { get; set; }
public string TSTVL1 { get; set; }

结果是:

[
  {
    ...
    "tstValue":null,
    "tstvL1":null
  },
  {
    ...
    "tstValue":null,
    "tstvL1":null
  }
]

预期/期望的输出将是带有驼峰属性名称的结果:

[
  {
    ...
    "tSTValue":null,
    "tSTVL1":null
  },
  {
    ...
    "tSTValue":null,
    "tSTVL1":null
  }
]

如何覆盖魔术行为?

【问题讨论】:

  • 你在项目中使用System.Text.Json吗?
  • 如果您使用的是 System.Text.Json。您可以在您的类中使用 [JsonPropertyName("")] 属性 [JsonPropertyName("tSTValue")] public string TSTValue { get;放; } 否则你可以查看 JsonNamingPolicy.ConvertName(String) 方法来创建你自己的自定义转换方法
  • @FeiHan:是的,我们使用的是System.Text.Json
  • @Kwiksilver:我更喜欢保持一切尽可能干净,没有属性。我会看看你的链接,谢谢!

标签: c# json asp.net-core asp.net-core-webapi camelcasing


【解决方案1】:

首先,您描述的行为是有意的。您可以在 Github https://github.com/dotnet/runtime/blob/master/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonCamelCaseNamingPolicy.cs 上查看源代码,幸好名称序列化可以相对轻松地进行自定义。

由于您指定不想使用属性,因此您可以创建自己的 JsonNamingPolicy,它可用于以您认为合适的方式序列化字段名称。

下面我创建了一个基本类,它确保第一个字符是小写的,并且不理会字段字符串的其余部分。 ConvertName(string name) 将为序列化类中的每个字段调用。在您的示例中,TSTValueTSTVL1

public class JsonFirstCharToLowerNamingPolicy : JsonNamingPolicy
{
    public override string ConvertName(string name)
    {
        // if the string is empty or the first character is already lowercase just return as is
        if (string.IsNullOrEmpty(name) || char.IsLower(name[0]))
            return name;

        char[] chars = name.ToCharArray(); // get a list of chars
        chars[0] = char.ToLowerInvariant(chars[0]); // make the first character lower case 

        // leave the rest of the characters alone or do more processing on it?

        return new string(chars); // return the altered string
    }
}

要使用该类,您只需将JsonSerializerOptions 设置为JsonSerializerOptions,如下所示。

var serializeOptions = new JsonSerializerOptions
{
    PropertyNamingPolicy = new JsonFirstCharToLowerNamingPolicy(),
    WriteIndented = true
};
var jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);

【讨论】:

  • 谢谢!我更喜欢将我的 Web API 的响应保持为强类型,并希望使解决方案尽可能通用/集中。所以我更改了 T4 代码生成的实现:所有类及其属性现在都使用 JsonCamelCaseNamingPolicy.ConvertName() 函数的复制版本生成和大小写,效果很好!可自定义的 JsonSerializerOptions 将在 .NET 5 中提供:github.com/dotnet/runtime/issues/31094#issuecomment-567232806
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2020-06-23
  • 2012-11-16
  • 1970-01-01
  • 2021-06-28
相关资源
最近更新 更多