将JSON转换为C#类时处理可能的null值

时间:2018-12-22 08:49:50

标签: c# .net json uwp

在将API数据转换为UWP中的C#类时,我遇到了一个有趣的问题。

我有一个返回图像尺寸的API,如下所示:

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

我还有一个类,其属性与json2csharp.com生成的JSON数据相匹配。

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

我正在使用类似以下的方法将JSON转换为C#类:

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

但是,如果API不知道高度或宽度,它将返回null而不是int,如下所示:

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

这显然会引发异常,特别是此错误消息:

  

Newtonsoft.Json.JsonSerializationException:将值{null}转换为类型'System.Int32'时出错

是否有某种方法可以解决此问题或处理这种情况?

5 个答案:

答案 0 :(得分:14)

您可以通过添加int使?为空:

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

除json2csharp.com以外,QuickType还可以帮助您做到这一点:

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

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

您必须自己添加URL属性。 QuickType还会为您生成许多其他内容,例如ParseStringConverter自定义JsonConverter

答案 1 :(得分:5)

如果期望数据null,请使用空包类型。将课程更改为:

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

答案 2 :(得分:1)

另一种可行的方法:

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

答案 3 :(得分:1)

我同意其他建议可为空的整数的答案。这似乎是最干净的方法。如果没有可以为空的整数,则可以尝试使用NullValueHandling选项,并将整数保留为默认值。作为对此处其他答案的补充,我提供了一个使用NullValueHandling设置的示例。

Fiddle (running example on dotnetfiddle)

代码

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; }
}

答案 4 :(得分:0)

考虑Newtonsoft.Json.NullValueHandling.Ignore选项。