JsonConvert.SerializeObject 中的默认双值处理

default double value handling in JsonConvert.SerializeObject

我正在使用 Newtonsoft.Json 来序列化自定义 class,但我对库如何处理双精度值的默认值有疑问。

class 可以是这样的:

class Person
{
    public string FullName { get; set; }
    public double Score {get; set; }
    public bool IsStudent {get; set; }
    public double Weight {get;set; }
}

其中 FullNameScore 是必填字段,IsStudent 是可选字段。

如果我序列化对象:

Person mark = new Person();
mark.FullName = "Mark Twain";
mark.Score = 0.0;
var jsonMark = JsonConvert.SerializeObject(mark);

我得到的是

{
  "FullName": "Mark Twain";
}

因为 0.0 是 double 的默认值。

我需要始终传递该值,即使它是 0.0。如果我用 JsonSerializerSettings

序列化
var settings = new JsonSerializerSettings();
settings.DefaultValueHandling = DefaultValueHandling.Include;
var jsonMark = JsonConvert.SerializeObject(mark);

我明白了

{
  "FullName": "Mark Twain",
  "Score": 0.0,
  "IsStudent": false,
  "Weight": 0.0
}

所以我没有设置的所有属性(在这个演示中 IsStudentWeight)。在我的原始代码中,class 包含其他 doubleboolean 字段,对于 API 我不需要包含它们(如果我传递 Weight 等于到 0 不是正确的值)。

有一种方法可以改变序列化的行为,使其只包含特定的字段(在我的例子中只是 Score 而不是 IsStudentWeight)或者至少只包含一个特定类型(double 但不是 bool)?

是你想要的吗?

class Person
{
    public string FullName { get; set; }
    public double Score {get; set; }
    public bool IsStudent {get; set; }
    public double? Weight {get;set; }
}

在这种情况下,如果您没有设置权重,它将为 NULL。

您可以用 JsonProperty attribute, and specifically set the DefaultValueHandling 为每个属性装饰这些特定属性:

class Person
{
    public string FullName { get; set; }
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
    public double Score { get; set; }
    public bool IsStudent { get; set; }
    public double Weight { get; set; }
}