在我正在使用的代码库中,用json序列化的最常见的对象有3个字段。其中一个字段的值通常为null,但并非总是为null。
我被要求避免在json构建中发送该字段,如果它的值为空。我不知道该怎么做。我所知道的JsonFX注释只允许忽略字段的值(JsonIgnore),或者转换字段的值(使用JsonName和属性)
发布于 2015-10-27 08:41:43
如果您想要无条件地跳过所有类型的所有属性和字段的空值,您可以子类化IResolverStrategy (可能是JsonResolverStrategy或PocoResolverStrategy),重写GetValueIgnoredCallback(MemberInfo member),并返回一个跳过空值的委托:
public class SkipNullJsonResolverStrategy : JsonResolverStrategy // Or PocoResolverStrategy
{
public override ValueIgnoredDelegate GetValueIgnoredCallback(MemberInfo member)
{
Type type;
if (member is PropertyInfo)
type = ((PropertyInfo)member).PropertyType;
else if (member is FieldInfo)
type = ((FieldInfo)member).FieldType;
else
type = null;
var baseValueIgnored = base.GetValueIgnoredCallback(member);
if (type != null && (!type.IsValueType || Nullable.GetUnderlyingType(type) != null))
{
return (ValueIgnoredDelegate)((instance, memberValue) => (memberValue == null || (baseValueIgnored != null && baseValueIgnored(instance, memberValue))));
}
else
{
return baseValueIgnored;
}
}
}然后像这样使用它:
var settings = new DataWriterSettings(new SkipNullJsonResolverStrategy());
var writer = new JsonWriter(settings);
var json = writer.Write(rootObject);如果只想跳过所选属性上的空值,则需要使用JsonResolverStrategy (或子类),然后选择
[DefaultValue(null)],或[JsonSpecifiedProperty(string methodName)],以指定要跳过该属性时返回false的另一个属性的名称。例如:
public class ExampleClass
{
[JsonSpecifiedProperty("NameSpecified")]
public string Name { get; set; }
bool NameSpecified { get { return Name != null; } }
[DefaultValue(null)]
public int? NullInteger { get; set; }
[DefaultValue(null)]
public DateTime? NullableDateTime { get; set; }
}https://stackoverflow.com/questions/33344902
复制相似问题