Как избежать отправки пустых полей с 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; }
}
Другие вопросы по тегам