【发布时间】:2020-08-26 13:29:43
【问题描述】:
我有一个 JsonElement 类型的对象,其中包含 API 返回的数据。我想获取某个属性的值,但问题是 TryGetProperty 区分大小写。 有没有一种方法或解决方法可以在忽略大小写敏感的情况下按名称获取属性?
谢谢。
【问题讨论】:
-
你用的是什么JSON解析库?
标签: c# asp.net-core system.text.json
我有一个 JsonElement 类型的对象,其中包含 API 返回的数据。我想获取某个属性的值,但问题是 TryGetProperty 区分大小写。 有没有一种方法或解决方法可以在忽略大小写敏感的情况下按名称获取属性?
谢谢。
【问题讨论】:
标签: c# asp.net-core system.text.json
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
的属性并且该值可以是 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() }
};
【讨论】: