Для достижения этого поведения вы должны использовать встроенный метод 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
Это кажется ошибкой с 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
не существует. Вместо этого вложенное kludgeCamelCasePropertyNamesContractResolver
можно использовать для сопоставления имен: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); } }