【问题标题】:Ignore case when using TryGetProperty使用 TryGetProperty 时忽略大小写
【发布时间】:2020-08-26 13:29:43
【问题描述】:

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

谢谢。

【问题讨论】:

  • 你用的是什么JSON解析库?

标签: c# asp.net-core system.text.json


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:

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

    System.Text.Json.JsonSerializerOptions 有一个名为 PropertyNamingPolicy

    的属性

    并且该值可以是 null 或 JsonNamingPolicy.CamelCase

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

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

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

    最后,JsonSerializerOptions 有一些预设会自动启用 camelCase。例如,这个 JsonSerializerDefaults.Web 预设会自动启用 camelCase。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2011-09-09
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多