Search code examples
jsonjson.netjsonconvert

How to serialize a class with Newtonsoft.Json.JsonConvert.SerializeObject to change empty List to null variable


How to serialize a class with Newtonsoft.Json.JsonConvert.SerializeObject to change empty List to null variable

my result from serialization

{"images":[]} or {"images":{}}

and would like to get

{"images":null}

my simple class

public class Images
{
[JsonProperty("images", Required = Required.Always, NullValueHandling = NullValueHandling.Include)]

   public Images()
   {
   Parameters = new Parameters(); **//  I know I could not initiate here only when I need it but I don't want to do it**
   }

   [JsonProperty("parameters", Required = Required.Always, NullValueHandling = NullValueHandling.Include)]
   public Parameters Parameters { get; set; }
}

public class Parameters 
{
   [JsonProperty("id", Required = Required.AllowNull, NullValueHandling = NullValueHandling.Include)]
   public string Id { get; set; }
}

Solution

  • I did something like that

               internal class NullEmptyConverter : JsonConverter
            {
                public override bool CanConvert(Type t) => t == typeof(GuidId);
                public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
                {
                    if (reader.TokenType == JsonToken.Null) return null;
                    var value = serializer.Deserialize<string>(reader);
                    return value;
                }
                public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
                {
                    if (JsonConvert.SerializeObject(untypedValue, Formatting.None).ToString() == "[]")
                    {
                        serializer.Serialize(writer, null);
                        return;
                    }
    
                    if (JsonConvert.SerializeObject(untypedValue, Formatting.None).ToString() == "{}")
                    {
                        serializer.Serialize(writer, null);
                        return;
                    }
    
                    serializer.Serialize(writer,untypedValue);
                    return;
                }
            }
    
    

    use    

     [JsonConverter (typeof (NullEmptyConverter))]
    

    immediately before

    public Parameters Parameters { get; set; }
    

    It works, but maybe it can be done better, simpler or somewhere else something is wrong here?