使用 TryGetProperty 时忽略大小写

Ignore case when using TryGetProperty

我有一个 JsonElement 类型的对象,其中包含 API 返回的数据。我想获取某个 属性 的值,但问题是 TryGetProperty 区分大小写。 有没有一种方法或解决方法可以在忽略区分大小写的情况下按名称获取属性?

谢谢。

EnumerateObject 将为您提供所有属性的列表。您可以遍历它们并找到第一个与忽略大小写的名称匹配的:

JsonElement value = null;
bool found = false;

var property = element.EnumerateObject()
                      .FirstOrDefault(p => string.Compare(p.Name, propName, 
                                                          StringComparison.OrdinalIgnoreCase) == 0);
if(property != null)
{
    value = property.Value;
    found = true;
}

我只想添加可能对其他人有帮助的额外相关信息。

System.Text.Json.JsonSerializerOptions 有一个 属性 称为 PropertyNamingPolicy

并且该值可以为空或 JsonNamingPolicy.CamelCase

因此,如果已设置,则 C# PascalCase 属性将在生成的 json 中转换为 JavaScript 驼峰命名。由于名称不匹配,这可能会在序列化和反序列化数据时产生意外问题。

通过在选项中设置 PropertyNameCaseInsensitive = true 可以部分解决该问题。然后就可以不区分大小写的方式进行序列化和反序列化了。

但是,如果您正在编写自定义 JsonConverter,那么您可能还需要使用 JsonDocument.RootElement.TryGetProperty() 通过区分大小写的名称查找 属性 .为此,您需要检查名称的 PascalCase 和 camelCase 变体,以使其与不同的选项设置兼容。

最后,JsonSerializerOptions 有一些预设会自动启用 camelCase。例如,此 JsonSerializerDefaults.Web 预设会自动启用驼峰命名法。

public JsonSerializerOptions Options = new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
    WriteIndented = true,
    Converters = { new MyCustomTypeConverter() }
};