使用c# System.Text.Json对json文本进行序列化/反序列化,并对属性名进行混合大小写



我正在尝试序列化/反序列化一个供应商json文件,其中包含骆驼大小写和pascal大小写属性名称。

结果对象使用Pascal case作为其属性。

使用System.Text.Json处理这种情况的正确方法是什么?

{
"name": "test",
"value": {
"Quote": {
"ask": 0,
"bid": 0
},
"CreatedBy": "User"
}
}

最简单的解决方案是打开不区分大小写

JsonSerializerOptions。PropertyNameCaseInsensitive

获取或设置一个值,该值确定属性的名称是否使用反序列化期间不区分大小写的比较。默认值是假的。

var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var mertle = JsonSerializer.Deserialize<blah>(bob, options);

额外资源

如何在System.Text.Json中启用不区分大小写的属性名匹配

默认情况下,反序列化查找区分大小写的属性名JSON和目标对象属性之间的匹配。为了改变这一点行为,设置JsonSerializerOptions.PropertyNameCaseInsensitivetrue

另一种解决这个问题的方法是将输入json规范化。

private static readonly Regex JsonKeyRegex = new Regex(@"(?m)^[ ]*([^rn:]+?)s*:");
static string ToJsonWithCamelCasing(string jsonWithMixedCasing)
{
var jsonKeys = JsonKeyRegex.Matches(jsonWithMixedCasing);
var jsonWithCamelCasingBuilder = new StringBuilder(jsonWithMixedCasing);
foreach (Match jsonKey in jsonKeys)
{
var from = jsonKey.Captures[0].Value;
var startLetterIdx = from.IndexOf(""") + 1;
var to = from.Substring(0, startLetterIdx) + char.ToLowerInvariant(from[statrLetterIdx]) + from.Substring(startLetterIdx + 1);
jsonWithCamelCasingBuilder.Replace(from, to);
}
return jsonWithCamelCasingBuilder.ToString();
}
  • 这个正则表达式将找到json中的键(测试用例)
    • 捕获的数据在前面包含一些空格,如:" "Quote":"
    • 这就是为什么我们需要找到json键的第一个字母(startLetterIdx)
  • to中,我们将json键的第一个字符替换为其较低的变体。
    • (是的,我知道它是有点脆弱)
  • 最后,我们使用StringBuilder构造了一个包含多个替换的新字符串。