在将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'时出错
是否有某种方法可以解决此问题或处理这种情况?
答案 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
选项。