有没有办法如何以编程方式启用/禁用[JsonProperty]
指定的属性名称的使用?
当我序列化时:
public class Dto
{
[JsonProperty("l")]
public string LooooooooooooongName { get; set; }
}
我希望能够在调试"中找到输出"
{
"LooooooooooooongName":"Data"
}
和"在发布":
{
"l":"Data"
}
答案 0 :(得分:4)
只需创建一个解析器来处理这项工作。
public class NoJsonPropertyNameContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.PropertyName = property.UnderlyingName;
return property;
}
}
以及启动代码中的某个地方
#if DEBUG
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new NoJsonPropertyNameContractResolver()
};
#endif
现在,您的Debug和Release版本之间存在不一致的行为(但为什么?)。
答案 1 :(得分:2)
您可以尝试使用C# preprocessor directives:
public class Dto
{
#if !DEBUG
[JsonProperty("l")]
#endif
public string LooooooooooooongName { get; set; }
}
修改强>
Ок,如果你必须围绕整个应用程序这样做,这可能不太方便。另一种更方便的方法是实现自定义ContractResolver
并将此预处理程序指令仅放在一个位置。
public class CustomContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var prop = base.CreateProperty(member, memberSerialization);
#if DEBUG
if(prop != null)
{
// If in debug mode -> return PropertyName value to the initial member name.
prop.PropertyName = member.Name;
}
#endif
return prop;
}
}
用法:
var jsonString = JsonConvert.SerializeObject(someObj, new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(),
});
注意:您可以在JsonConverter周围实现包装器或使用默认的json序列化器设置,因此您不需要每次都指定合约解析器。