我有一个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);过转换,但是我找不到如何使键变为小写。 有任何想法吗?
JToken json = JToken.Parse(jsonString);
我之所以需要这样做是为了使我的JsonSchema验证不区分大小写。
JsonSchema
用最少的代码来解决这个问题的一种可能方式是继承JsonTextReader并重写Value属性返回一个小写的字符串,只要当前TokenType是PropertyName:
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属性从读取器检索属性名称时依赖于此。
JsonSerializerInternalReader
您可以创建一个简短的辅助方法,以方便使用自定义阅读器反序列化:
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 = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString);
小提琴:https : //dotnetfiddle.net/A0S3I1