Как изменить все ключи на строчные при разборе 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 будет нечувствительна к регистру.
695   1  

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

    Ничего не найдено.