c# - 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>
示例可能并不理想。
解决方案
这些值不可为空,因此它们永远不会为空。您看不到打印字符串属性的原因是字符串可以为空,因此它们的默认值为空。int、long 等数值类型的默认值为 0、0.0 等。如果您真的想忽略默认值,则需要DefaultValueHandling
改用。我通常只会使这些属性为空(例如,int? MyNullableInt
),因为我真的不关心空值,但有些项目可能确实具有我需要知道的值 0。
https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm
推荐阅读
- entity-framework-core - MassTransit - 具有 Entity Framework Core 的 Saga 存储库
- mysql - MySQL如何在INSERT ON DUPLICATE UPDATE插入多个值后获取受影响行的所有ID
- r - 如何在 R 中对 ggplot 中使用的数字进行舍入
- javascript - 为什么在更新 IntArray 时,crypto-js 输出中的更新与 NodeJS 的 crypto 不同
- javascript - 尝试使用反应更新对象数组中的现有对象
- php - 计算子/子数组中的条目
- sql - 使用键/索引/其他东西选择多列
- python - 带有灰度图像的 CNN 上的形状问题
- javascript - MongoDB - 更新数组中的多个子数组
- javascript - ANTD:如何更改分页选择框中的文本