2015-10-26 2 views
0

В кодовой базе, которую я использую, наиболее распространенный объект, который сериализован в json, имеет 3 поля. Значение одного из этих полей часто, но не всегда, равно нулю.Как избежать отправки нулевых полей с помощью JsonFX

Меня попросили не отправлять поле в json build, если его значение равно null. И я не понимаю, как это сделать. Обозначения 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 (или подкласс), а затем либо

Например:

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; } 
} 
+1

вы используете JsonFx v1 или v2? Если v2, то @dbc дал несколько хороших способов. Если вы используете v1, используйте '[DefaultValueAttribute (null)]'. – mckamey

Смежные вопросы