【问题标题】:How to change all keys to lowercase when parsing JSON to a JToken将 JSON 解析为 JToken 时如何将所有键更改为小写
【发布时间】:2017-04-13 02:10:13
【问题描述】:

我有一个 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 验证将不区分大小写。

【问题讨论】:

  • JProperty 只有名称的 getter,所以我认为您在更改它时会遇到问题。
  • 是的。我在想有一些方法可以自定义解析机制。类似于具有 reviver 参数 (developer.mozilla.org/en/docs/Web/JavaScript/Reference/…) 来编辑解析的 js 解析函数。我只是不确定如何在 json.net 中自定义。
  • 如果您想创建自定义 Json 转换器,请查看此内容。我不知道它是否对您当前的情况有所帮助:stackoverflow.com/questions/8030538/…
  • 也许在加载 JSON 之后使用这个? Json.net rename properties.
  • @Jim 你为什么删除你的答案?虽然它对我的情况没有帮助,但它可以帮助其他用户。

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


【解决方案1】:

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

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 属性。

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

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

小提琴:https://dotnetfiddle.net/A0S3I1

【讨论】:

  • 这正是我正在寻找的解决方案。它在解析时变为小写,这是最有效的。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2021-12-23
  • 2021-10-08
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多