首页 > 解决方案 > JsonConvert 在序列化中不包括未设置的数字成员

问题描述

我有一堂课

public class Container
{
    public long Id { get; set; }
    public string Name { get; set; }
    public List<string> Aliases { get; set; }
    public double Height { get; set; }
    public double Weight { get; set; }
}

如果我创建

var container = new Container
{
    Weight = 127.3
}

我希望它序列化为 JSON:

{
  "Weight": 127.3
}

但实际上它被序列化为:

{
  "Id": 0,
  "Height": 0.0,
  "Weight": 127.3
}

我正在尝试使用它来序列化它:

var settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    MissingMemberHandling = MissingMemberHandling.Ignore
};
var json = JsonConvert.SerializeObject(container, Formatting.Indented, settings);

int据我所知,原始类型(就像long我猜的那样)不能为空。我认为这就是导致这种意外行为的原因。

当我没有明确设置值时,如何解决这个问题以获得我想要的输出?我认为将所有内容都long变成Nullable<long>示例可能并不理想。

标签: c#json.net

解决方案


这些值不可为空,因此它们永远不会为空。您看不到打印字符串属性的原因是字符串可以为空,因此它们的默认值为空。int、long 等数值类型的默认值为 0、0.0 等。如果您真的想忽略默认值,则需要DefaultValueHandling改用。我通常只会使这些属性为空(例如,int? MyNullableInt),因为我真的不关心空值,但有些项目可能确实具有我需要知道的值 0。

https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm


推荐阅读