Как игнорировать некоторые DataMember в JSON времени выполнения - PullRequest
0 голосов
/ 14 октября 2019

// я хочу, чтобы некоторые члены данных сериализовали не все на основании какого-либо условия.

class Days
{
}

class Weeks
{
}

class Months 

{
List<Days> listDays=new List<Days>();
List<Months > listMonths=new List<Months >();
}

class Year
{
Months m=new Months();
  if(day=="monday")
{
listDays.add(day)
}

}

class Year
{
Months m=new Months();
  if(day=="monday")
{
listDays.add(day)
}


  i dont want to empty here months that i not used so i want to remove when json created     

{"listMonths": [], "listDays": ["Monday"]}

"listMonths": [] дайте мне какое-то решение, чтобы я мог свести на нет ненужный элемент данных во время сериализации.

1 Ответ

0 голосов
/ 14 октября 2019

вы можете попробовать перегруженный метод SerializeObject, чтобы исключить нулевые объекты. что-то вроде ниже

JsonConvert.SerializeObject(jSONDocument, 
                        Newtonsoft.Json.Formatting.None, 
                        new JsonSerializerSettings { 
                            NullValueHandling = NullValueHandling.Ignore
                        });

К сожалению, нет возможности сериализатора игнорировать пустые коллекции. однако вы можете использовать DefaultContractResolver, чтобы игнорировать пустую коллекцию

public class EmptyCollectionContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        Predicate<object> shouldSerialize = property.ShouldSerialize;
        property.ShouldSerialize = obj => (shouldSerialize == null || shouldSerialize(obj)) && !IsEmptyCollection(property, obj);
        return property;
    }

    private bool IsEmptyCollection(JsonProperty property, object target)
    {
        var value = property.ValueProvider.GetValue(target);
        var collection = value as ICollection;
        if (collection != null && collection.Count == 0)
            return true;

        if (!typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
            return false;

        var countProp = property.PropertyType.GetProperty("Count");
        if (countProp == null)
            return false;

        var count = (int)countProp.GetValue(value, null);
        return count == 0;
    }
}

И изменить SerializeObject на

json = JsonConvert.SerializeObject(jSONDocument,
                    Newtonsoft.Json.Formatting.None,
                    new JsonSerializerSettings
                    {
                        ContractResolver = new EmptyCollectionContractResolver(),
                        NullValueHandling = NullValueHandling.Ignore
                    });
...