c# - 将 JSON 解析为 JToken 时如何将所有键更改为小写

标签 c# json json.net jsonschema json-deserialization

我有一个 JSON 字符串,键有大写和小写字符:

{"employees":[
    {"FIrstName":"John", "LASTname":"Doe"},
    {"FIRSTNAME":"Anna", "LaSTNaME":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

我想将它转换为一个 JToken 对象,并让 JToken 中的所有键都小写。所以在 JToken 内部应该是这样的:

{"employees":[
    {"firstname":"John", "lastname":"Doe"},
    {"firstname":"Anna", "lastname":"Smith"},
    {"firstname":"Peter", "lastname":"Jones"} 
]}

以前我使用 JToken json = JToken.Parse(jsonString); 进行转换,但我找不到如何将键设为小写。 有什么想法吗?

我需要这样做的原因是我的 JsonSchema 验证将不区分大小写。

最佳答案

用最少的代码解决这个问题的一种可能方法是子类化 JsonTextReader并覆盖 Value属性在当前 TokenType 时返回小写字符串是PropertyName :

public class LowerCasePropertyNameJsonReader : JsonTextReader
{
    public LowerCasePropertyNameJsonReader(TextReader textReader)
        : base(textReader)
    {
    }

    public override object Value
    {
        get
        {
            if (TokenType == JsonToken.PropertyName)
                return ((string)base.Value).ToLower();

            return base.Value;
        }
    }
}

这是有效的,因为底层 JsonTextReader保留 TokenType随着其内部状态的变化而更新,并且序列化器(实际上是 JsonSerializerInternalReader 类)在通过 Value 从读取器检索属性名称时依赖于它属性(property)。

您可以创建一个简短的辅助方法,以便使用自定义阅读器轻松反序列化:

public static class JsonHelper
{
    public static JToken DeserializeWithLowerCasePropertyNames(string json)
    {
        using (TextReader textReader = new StringReader(json))
        using (JsonReader jsonReader = new LowerCasePropertyNameJsonReader(textReader))
        {
            JsonSerializer ser = new JsonSerializer();
            return ser.Deserialize<JToken>(jsonReader);
        }
    }
}

然后在您的代码中,只需将其替换为:

JToken json = JToken.Parse(jsonString);

用这个:

JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString);

fiddle :https://dotnetfiddle.net/A0S3I1

关于c# - 将 JSON 解析为 JToken 时如何将所有键更改为小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859805/

相关文章:

php - 调用未定义函数 json_encode - Ubuntu 14.04 和 phpbrew 上的 Drupal 站点设置

javascript - 如何修改/重新转换 JSON 数组结构

c# - 使用现有项目将 json 反序列化为 C# 列表

c# - 反序列化保留本地时间的日期

c# - Json.NET 自定义 ValueProvider 将 Objects 转换为 Guid

c# - 我应该缓存并重用从 HttpClientFactory 创建的 HttpClient 吗?

c# - 四舍五入到最接近的整数

c# - MySQL - 更新我正在选择的相同记录

c# - 对象序列化上下文中的 TYPE FIDELITY 是什么?

javascript - 获取匹配特定值的 JSON 对象