如何使用System.Text.Json将对象属性序列化为小写?

5
我有一个ASP.NET 5 MVC Core应用程序控制器,其中包含以下代码:
using System.Text.Json;

public async Task<IActionResult> EstoAPICall() {
  ...
  EstoOst estoOst;
  var json = JsonSerializer.Serialize(estoOst);
  StringContent content = new(json, Encoding.UTF8, "application/json");
  using var response = await httpClient.PostAsync("https://example.com", content);
  ...
}

public class EstoOst {
  public decimal Amount { get; set; }
}

这会导致错误,因为API要求JSON中的amount为小写,但.Serialize(...)返回大写的Amount

我该如何解决?

切换到Json.NET或将类属性名称更改为小写似乎不是好的解决方案。

2个回答

14
如果您真正想要的是所有小写属性名称而不是驼峰式属性名称,例如FullName变成fullname而不是fullName,那么没有内置的方法-您将需要创建自己的JsonNamingPolicy。可以像这样创建:LowerCaseNamingPolicy.cs。请注意,保留了HTML标签。
public class LowerCaseNamingPolicy : JsonNamingPolicy
{
  public override string ConvertName(string name)
  {
      if (string.IsNullOrEmpty(name) || !char.IsUpper(name[0]))
          return name;

      return name.ToLower();
  }
}

用法:

var options = new JsonSerializerOptions {
    PropertyNamingPolicy = new LowerCaseNamingPolicy(),
};

var json = JsonSerializer.Serialize(estoOst, options);

不过,我认为你正在寻找驼峰命名法,因为你提到了 Json.NET,而它也没有小写命名规则。

如果是这样的话,请将 JsonSerializerOptions.PropertyNamingPolicy 属性设置为 JsonNamingPolicy.CamelCase,以将属性名称序列化为驼峰格式:

var options = new JsonSerializerOptions {
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = JsonSerializer.Serialize(estoOst, options);

这是一个可运行的演示,用于输出并显示两种方法的输出差异:
public class Program
{
  public static void Main()
  {
      var person = new Person
      {
          Age = 100,
          FullName = "Lorem Ipsum"
      };

      var camelCaseJsonSerializerOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
      var lowercaseJsonSerializerOptions = new JsonSerializerOptions { PropertyNamingPolicy = new LowerCaseNamingPolicy()};

      var camelCaseJson = JsonSerializer.Serialize(person, camelCaseJsonSerializerOptions);
      var lowercaseJson = JsonSerializer.Serialize(person, lowercaseJsonSerializerOptions);

      Console.WriteLine(camelCaseJson);
      Console.WriteLine(lowercaseJson);
  }
}

public class Person
{
  public string FullName { get; set; }
  public int Age { get; set; }
}

public class LowerCaseNamingPolicy : JsonNamingPolicy
{
  public override string ConvertName(string name)
  {
      if (string.IsNullOrEmpty(name) || !char.IsUpper(name[0]))
          return name;

      return name.ToLower();
  }
}

输出:

{"fullName":"Lorem Ipsum","age":100}
{"fullname":"Lorem Ipsum","age":100}

0
在JsonSerializerOptions中使用PropertyNameCaseInsensitive:
示例:
var options = new JsonSerializerOptions
{
     PropertyNameCaseInsensitive = true 
};

var weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString, options);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接