在将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);
转换,但我不知道如何使键小写。 有任何想法吗?
我需要这样做的原因是我的JsonSchema
validation将不区分大小写。
使用最少代码解决此问题的一种可能方法是子类化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
属性从阅读器检索属性名称时。
您可以创建一个简短的帮助方法,以便使用自定义阅读器轻松反序列化:
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