启用/禁用指定[JsonProperty]名称的使用

时间:2015-09-15 16:23:01

标签: c# json.net

有没有办法如何以编程方式启用/禁用[JsonProperty]指定的属性名称的使用?

当我序列化时:

public class Dto
{
    [JsonProperty("l")]
    public string LooooooooooooongName { get; set; }
}

我希望能够在调试"中找到输出"

{
    "LooooooooooooongName":"Data"
}

和"在发布":

{
    "l":"Data"
}

2 个答案:

答案 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序列化器设置,因此您不需要每次都指定合约解析器。