Как изменить все ключи на строчные при разборе JSON на JToken
У меня есть строка 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 будет нечувствительна к регистру. 1 ответ:
Один из возможных способов решить эту проблему с минимальным кодом-это подкласс
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<JToken>(jsonReader); } } }Тогда в вашем коде просто замените это:
JToken json = JToken.Parse(jsonString);С этим:
JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString);Скрипка: https://dotnetfiddle.net/A0S3I1
Comments