максимально отвратительное решение если честно. но формально - задачу выполняет. на случай если не выйдет донести что с ньютонсофтом тут жизнь будет проще. только допишите для всех остальных типов, я только набросал идею
static void Main(string[] args)
{
var obj = new
{
a = new { },
b = new
{
c = new { },
d = new
{
val = 1,
val2 = new int[0],
val3 = (object)null
}
},
c = new
{
d = new
{
val = string.Empty,
val2 = "sratrt",
val3 = new[] {1,2,3,4,5}
}
}
};
var json = JsonSerializer.Serialize(obj);
var result = RemoveEmptyValues(json);
//{"a":{},"b":{"c":{},"d":{"val":1}},"c":{"d":{"val2":"sratrt","val3":[1,2,3,4,5]}}}
}
private static string RemoveEmptyValues(string jsonString)
{
var jsonDoc = JsonDocument.Parse(jsonString);
dynamic dynObject = new ExpandoObject();
Iterate(jsonDoc.RootElement, dynObject);
return JsonSerializer.Serialize(dynObject);
}
private static void Iterate(JsonElement doc, IDictionary<string, object> result)
{
foreach (var node in doc.EnumerateObject())
{
if (node.Value is JsonElement jDoc)
{
if (node.Value.ValueKind == JsonValueKind.Object)
{
var nodeContent = new ExpandoObject();
result.Add(node.Name, nodeContent);
Iterate(jDoc, nodeContent);
}
else if (node.Value.ValueKind == JsonValueKind.Number)
{
var value = node.Value.GetInt64();
result.Add(node.Name, value);
}
else if (node.Value.ValueKind == JsonValueKind.Array)
{
if (node.Value.GetArrayLength() != 0)
{
var array = new List<object>();
foreach (var item in node.Value.EnumerateArray())
{
array.Add(item);
}
result.Add(node.Name, array);
}
}
else if (node.Value.ValueKind == JsonValueKind.String)
{
var value = node.Value.GetString();
if (!string.IsNullOrEmpty(value){
result.Add(node.Name, value);
}
}
else if (node.Value.ValueKind == JsonValueKind.Null)
{
}
else
{
throw new NotImplementedException($"Unexpected json value type {node.Value.ValueKind}");
}
}
}
}