Как избежать отправки пустых полей с JsonFX
В кодовой базе, на которой я работаю, самый распространенный объект, сериализованный в json, имеет 3 поля. Значение одного из этих полей часто, но не всегда, равно нулю.
Меня попросили не отправлять поле в сборке json, если его значение равно нулю. И я не вижу, как это сделать. Аннотации JsonFX, которые я знаю, позволяют только игнорировать поле независимо от его значения (JsonIgnore) или преобразовывать значение поля (используя JsonName и свойства)
1 ответ
Если вы хотите безоговорочно пропустить нули для всех свойств и полей всех типов, вы можете создать подкласс 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; }
}