it-swarm.com.de

Behandelt einen möglichen Nullwert bei der Konvertierung von JSON in die C # -Klasse

Beim Konvertieren von API-Daten in eine C # -Klasse in UWP ist ein interessantes Problem aufgetreten.

Ich habe eine API, die Bildabmessungen wie folgt zurückgibt:

{
    "height": "25",
    "width": "25"
}

Ich habe auch eine Klasse mit Eigenschaften, die mit den JSON-Daten übereinstimmen, die von json2csharp.com generiert werden.

public class Image
{
    public int height { get; set; }
    public Uri url { get; set; }
    public int width { get; set; }
}

Und ich konvertiere die JSON in eine C # -Klasse, und zwar in etwa wie folgt:

dynamic JsonData = JObject.Parse(JsonString);
Image img = JsonData.ToObject<Image>();

Wenn das API die Höhe oder Breite jedoch nicht kennt, gibt es null anstelle einer int zurück, wie folgt:

{
    "height": null,
    "width": "25"
}

Dies verursacht offensichtlich eine Ausnahme, insbesondere diese Fehlermeldung:

Newtonsoft.Json.JsonSerializationException: Fehler beim Konvertieren des Werts {null} in den Typ 'System.Int32'.

Gibt es eine Möglichkeit, dieses Problem zu umgehen oder mit diesem Szenario umzugehen?

7
Arlo

Sie können eine int nullbar machen, indem Sie einen ? hinzufügen:

public class Image
{
    public int? height { get; set; }
    public Uri url { get; set; }
    public int? width { get; set; }
}

Anders als json2csharp.com kann QuickType Ihnen auch dabei helfen:

public partial class Image
{
    [JsonProperty("height")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long? Height { get; set; }

    [JsonProperty("width")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long Width { get; set; }
}

Sie müssen die URL-Eigenschaft selbst hinzufügen. QuickType generiert auch eine Reihe anderer Dinge, z. B. ParseStringConverter custom JsonConverter.

14
Sweeper

Wenn Sie null für Ihre Daten erwarten, verwenden Sie nullfähige Typen. Ändern Sie Ihre Klasse in:

public class Image {
    public int? height { get; set; }
    public Uri url { get; set; }
    public int? width { get; set; }
}
5
Racil Hilan

Ich stimme den anderen Antworten zu, die auf nullbare ganze Zahlen schließen lassen. Dies scheint der sauberste Ansatz zu sein. Wenn nullfähige Ganzzahlen keine Option sind, können Sie tatsächlich die NullValueHandling-Option ausprobieren und die Ganzzahlen auf ihrem Standardwert belassen. Als Kompliment zu den anderen Antworten hier habe ich ein Beispiel eingefügt, das die NullValueHandling-Einstellung verwendet.

Fiddle (laufendes Beispiel auf dotnetfiddle)

Code

using System;
using Newtonsoft.Json;

public class Program
{
    private static string JsonWithNull = @"{ 'height': '25', 'width': null }";

    public static void Main()
    {
        var settings = new JsonSerializerSettings()
        {
            NullValueHandling = NullValueHandling.Ignore
        };

        Image image = JsonConvert.DeserializeObject<Image>(JsonWithNull, settings);

        Console.WriteLine("The image has a height of '{0}' and a width of '{1}'", image.height, image.width);
    }
}

public class Image
{   
    public int height { get; set; }
    public Uri url { get; set; }
    public int width { get; set; }
}
1
Fluous

Ein weiterer praktikabler Ansatz:

JsonConvert.SerializeObject(myObject, 
                            Newtonsoft.Json.Formatting.None, 
                            new JsonSerializerSettings { 
                                NullValueHandling = NullValueHandling.Ignore
                            });
1
Majedur Rahaman

Erwägen Sie die Newtonsoft.Json.NullValueHandling.Ignore-Option.

0
Boris Nikitin