вы можете попробовать перегруженный метод 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
});