Сбросить контрактный кэш Json.NET [дубликат]

Для достижения этого поведения вы должны использовать встроенный метод globals():

def var_of_var(k, v): globals()[k] = v print variable_name # NameError: name 'variable_name' is not defined some_name = 'variable_name' globals()[some_name] = 123 print variable_name # 123 some_name = 'variable_name2' var_of_var(some_name, 456) print variable_name2 # 456
2
задан Mark Olbert 9 June 2015 в 22:20
поделиться

1 ответ

Это кажется ошибкой с CamelCasePropertyNamesContractResolver . Его базовый класс DefaultContractResolver имеет два конструктора: конструктор без параметров и версию DefaultContractResolver (Boolean) (только что устаревшие в Json. NET 7.0). Этот параметр имеет следующее значение:

shareCache

  • Тип: System.Boolean Если установлено значение true, DefaultContractResolver будет использовать кешированный общий доступ с другими преобразователями тот же тип. Совместное использование кеша значительно улучшит производительность с помощью нескольких экземпляров resolver, потому что дорогое отражение произойдет только один раз. Этот параметр может вызвать неожиданное поведение, если разные экземпляры резольвера предполагают получение разных результатов. Если установлено значение false, настоятельно рекомендуется повторно использовать экземпляры DefaultContractResolver с помощью JsonSerializer.

По умолчанию false.

К сожалению, конструктор по умолчанию для CamelCasePropertyNamesContractResolver устанавливает значение в true:

public class CamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    public CamelCasePropertyNamesContractResolver()
#pragma warning disable 612,618
        : base(true)
#pragma warning restore 612,618
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }
}

Кроме того, нет второго конструктора с shareCache. Это нарушает ваш SpecificFieldsResolver.

В качестве обходного пути вы можете получить свой резольвер из DefaultContractResolver и использовать CamelCaseNamingStrategy для отображения имени:

public class IndependentCamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    public IndependentCamelCasePropertyNamesContractResolver()
        : base()
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }    
}

public class SpecificFieldsResolver : IndependentCamelCasePropertyNamesContractResolver
{
    // Remainder unchanged
}

Обратите внимание, что если вы используете версию Json.NET до 9.0, CamelCaseNamingStrategy не существует. Вместо этого вложенное kludge CamelCasePropertyNamesContractResolver можно использовать для сопоставления имен:

public class IndependentCamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    class CamelCaseNameMapper : CamelCasePropertyNamesContractResolver
    {
        // Purely to make the protected method public.
        public string ToCamelCase(string propertyName)
        {
            return ResolvePropertyName(propertyName);
        }
    }
    readonly CamelCaseNameMapper nameMapper = new CamelCaseNameMapper();

    protected override string ResolvePropertyName(string propertyName)
    {
        return nameMapper.ToCamelCase(propertyName);
    }
}
6
ответ дан dbc 20 August 2018 в 14:54
поделиться
  • 1
    Вау! И здесь я думал, что мой вопрос слишком неясен и слишком недокументирован, чтобы создать ответ. Большое спасибо! Ваш анализ был точно верен. Я принял несколько иной подход к вашему решению просто потому, что использовал несколько разрешений для решения проблемы с верблюжьим корпусом. Вы знаете, было ли это ограничение сообщено Json.NET? – Mark Olbert 9 June 2015 в 22:17
  • 2
    @MarkOlbert - Рад помочь. нет, я не знаю, было ли это сообщено. – dbc 9 June 2015 в 22:21
  • 3
    Большое вам спасибо за это объяснение. Заводил меня батти. – Rich 7 January 2016 в 16:45
  • 4
    В этой же проблеме возникла проблема, и на это ушло всего лишь один день, чтобы выяснить проблему, и только час, чтобы выяснить проблему конструктора CamelCase. По крайней мере, у нас есть источник для чтения. – Brian J. Miller 26 July 2016 в 20:45
Другие вопросы по тегам:

Похожие вопросы: