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

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

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

我想将它转换为JToken对象,并将JToken所有键都JToken为小写。 所以JToken内部应该如下:

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

以前我用的是JToken json = JToken.Parse(jsonString); 转换,但我不知道如何使键小写。 有任何想法吗?

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

使用最少代码解决此问题的一种可能方法是子类化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(jsonReader); } } } 

然后在你的代码中,只需替换它:

 JToken json = JToken.Parse(jsonString); 

有了这个:

 JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString); 

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