当前位置: 首页 > 面试题库 >

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

姬旭
2023-03-14
问题内容

我有一个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属性返回一个小写的字符串,只要当前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;
        }
    }
}

之所以可行,是因为底层JsonTextReaderTokenType内部状态变化时保持更新,并且序列化程序(实际上是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



 类似资料:
  • 问题内容: 我有一些JSON数据,但所有键都为大写。如何解析它们并将键转换为更低的键?我正在使用jQuery。 例如: JSON数据: 所需的输出: 问题答案: 这个怎么样: 正则表达式捕获键名$ 1并将其转换为小写。 现场演示:http : //jsfiddle.net/bHz7x/1/ [edit]要解决@FabrícioMatté的评论,另一个仅匹配文字字符的演示: http //jsfid

  • 我正在尝试将JSON转换为GSON,我不确定这是最好的结构。 所有响应都由代码、消息和数据结构组成。但数据的内部结构可能会有所不同。 这是我的回应对象

  • 问题内容: 兼职勉强的DBA在这里。我想将现有的主键索引从群集更改为非群集。语法在逃避我。 这就是现在的脚本编写方式。 我在在线文档中没有看到ALTER CONSTRAINT语句。 问题答案: 删除聚集索引,然后将主键重新创建为非聚集键:

  • 问题内容: 我做了一些研究,似乎标准的Jsoup做出了更改。我想知道是否有一种配置方式,或者是否可以将其他解析器转换为Jsoup文档,或者通过某种方式解决此问题? 问题答案: 不幸的是,类的构造函数没有将名称更改为小写: 但是有两种方法可以改变这种行为: 如果您想要一个 干净的 解决方案,则可以克隆/下载JSoup Git并更改此行。 如果您想使用 肮脏的 解决方案,则可以使用反射。 #2的示例:

  • 问题内容: 我在MongoDB中的规范化数据模型结构中遇到以下错误: 这是由于以下原因造成的: 具体的部分。我的文档中有一个DBRef对象,因此我可以引用另一个集合中的文档。嵌入式文档结构不是选项。那么我该如何解决呢? 问题答案: 您必须为其导入DBRef编解码器才能进行打印,如果您希望以文档json样式进行打印,则需要编写自己的DBRef编解码器,并将其添加到您给toJson()的编解码器中。

  • 问题内容: 我有一个XML文件,例如 如何将其解析为JSON结构文件? 问题答案: 对于一个简单的解决方案,我建议使用Jackson库,它是一个Java库,用于生成和读取带有XML扩展名的JSON,因为它只需几行简单的代码就可以将任意复杂的XML转换为JSON。 input.xml Java代码: 该演示使用Jackson 1.7.7 (较新的1.7.8也可以使用),Jackson XML Dat