如何在ServiceStack中为特定实体/类使用IncludeNullValues?

时间:2014-08-08 11:18:24

标签: servicestack

目前,我正在使用以下代码忽略所有类别/实体的null字段。

JsConfig.IncludeNullValues = false;

是否有任何机制可以为某个实体/类配置JsConfig

这样的事情:

JsConfig<EntityA>.IncludeNullValues = true;

1 个答案:

答案 0 :(得分:4)

我相信您可以将JsConfig范围块与JsConfig DeSerializeFnSerializeFn函数结合使用,为特定实体配置JsConfig设置。

使用AppHost Configure方法:

反序列化:

JsConfig<TestRequest>.RawDeSerializeFn = (json) => {
    using(JsConfig.With(new Config { IncludeNullValues = true }))
    {
        return JsonSerializer.DeserializeFromString<TestRequest>(json);
    }
};

序列化:

如果您使用的是ServiceStack 4.0.31+,则以下代码将正常运行:

JsConfig<TestRequest>.RawSerializeFn = (obj) => {
    using(JsConfig.With(new Config { IncludeNullValues = true }))
    {
        return obj.ToJson();
    }
};

但是,如果您使用的是较旧版本的ServiceStack,则会出现一个问题,即代码会因递归调用而导致StackOverflowException。这可以通过包装来解决。

因此我们可以创建一个简单的类,例如AllowNull<T>

public class AllowNull<T>
{
    public T Value { get; set; }
    public AllowNull(T value)
    {
        Value = value;
    }
}

而是使用:

JsConfig<AllowNull<TestRequest>>.RawSerializeFn = (obj) => {
    using(JsConfig.With(new Config { IncludeNullValues = true }))
    {
        return JsonSerializer.SerializeToString<TestRequest>(obj.Value);
    }
};

要序列化的值需要包装:

TestRequest request =
...
return new AllowNull<TestRequest>(request);

TestRequest是您的实体

我希望有所帮助。