2016-06-27 11 views
2

Ich benutze Json.Net, um JSON in meine App Logik zu parsen. Das Problem ist, dass die externe API, von der ich den JSON bekomme, manchmal "Null" -Elemente in ihren Listen hat. Ich möchte diese "Null" -Elemente aus der Liste (oder jeder anderen IEnumerable, die das haben könnte) zur Parse-Zeit entfernen. Ich glaube, die Lösung muss einen JsonConverter verwenden, aber ich konnte es bisher nicht funktionieren.So entfernen Sie Nullwerte aus IEnumerables beim Analysieren von JSON mit Json.Net

MyData data = new MyData(); 
Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings 
{ 
    Converters = new List<JsonConverter>() { new TrimNullListValues() } 
}; 
string jsonString = @"{""ListData"": [{""source"" : 10 , ""target"" : 20, ""Data"" : [{""source"" : 100 , ""target"" : 200}, null]}, null]}"; 
JsonConvert.PopulateObject(jsonString, data, settings); 

MyData Klasse ist wie folgt:

public class MyData { 
    public class MyNestedData 
    { 
    public int Source; 
    public int Target; 
    public List<MyNestedData> Data; 
    } 

    public List<MyNestedData> ListData; 
} 

Mein JsonConverter (TrimNullListValues) ist wie folgt:

public class TrimNullListValues : JsonConverter { 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
    serializer.Serialize(writer, value); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
    // Don't really know what to do in here to remove unwanted values 
    // From the IEnumerabes 
    } 

    public override bool CanConvert(Type objectType) 
    { 
    return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(List<>); 
    } 
} 
+0

Sehen Sie, wenn es Ihnen hilft http://stackoverflow.com/questions/16455837/remove-null-values-in-json-and-update-json – Aby

+0

Nein, das funktioniert nicht für mich :(Es würde funktionieren, wenn die ganze Liste null war, aber nicht für Werte innerhalb der Liste. Thx sowieso – alamatula

Antwort

2

Sie könnten so etwas wie dies versuchen:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    JArray array = JArray.Load(reader); 
    foreach (JToken item in array.ToList()) 
    { 
     if (item.Type == JTokenType.Null) 
      item.Remove(); 
    } 
    object list = Activator.CreateInstance(objectType); 
    serializer.Populate(array.CreateReader(), list); 
    return list; 
} 

Geige: https://dotnetfiddle.net/SESCfZ

+0

Danke es funktioniert gut für dieses Beispiel. Aber wenn ich eine Liste innerhalb von "MyNestedData" mit einigen Nullwerten habe, werden diese nicht entfernt. https://dotnetfiddle.net/ojnMWd – alamatula

+1

Oh, ist deine Struktur rekursiv? Das hättest du wahrscheinlich in der Frage erwähnt. Ich habe meine Antwort aktualisiert. –

Verwandte Themen