You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中Size类与自定义MySize类JSON序列化结果为何不同?

问题:Size与自定义MySize类JSON序列化结果差异原因

我曾使用Size类存储对象的宽高,但该类仅能存储integer类型值,因此我创建了由double类型组成的MySize类并使用。但出现了异常情况:序列化Size类与MySize类得到的JSON结果存在差异。相关代码如下:

public class MySize
{
    [JsonConstructor]
    public MySize() { }
    public MySize(double _Width, double _Height)
    {
        Width = _Width;
        Height = _Height;
    }
    public double Width { get; set; }
    public double Height { get; set; }
}

public async Task<IActionResult> test()
{
    Size test = new Size(0, 0);
    MySize test2 = new MySize(1, 1);
    var json1 = JsonConvert.SerializeObject(test);
    var json2 = JsonConvert.SerializeObject(test2);
    Console.WriteLine(json1);
    Console.WriteLine(json2);
}

序列化结果对比:

  • Size类序列化结果:
"variable": "0, 0"
  • MySize类序列化结果:
"variable": {
    "Width": 0,
    "Height": 0
}

请问二者序列化结果存在差异的原因是什么?

原因分析

差异的核心原因是Json.NET(Newtonsoft.Json)对Size类有内置的自定义序列化规则,而你的MySize类使用的是默认的对象序列化逻辑:

  1. Size类的特殊处理
    Size是.NET框架中的内置值类型,Json.NET为它提供了专门的转换器(SizeConverter),会将其序列化为逗号分隔的字符串格式(比如"0, 0"),这是框架预设的序列化行为,目的是和该类型的字符串表示保持一致。

  2. MySize类的默认序列化
    你自定义的MySize类没有配置任何自定义序列化规则,Json.NET会使用默认的对象序列化逻辑:遍历类的公共属性(Width和Height),将其序列化为键值对组成的JSON对象结构。

如果想要让MySize类和Size类的序列化格式一致,你可以为MySize类实现自定义的JsonConverter,或者重写ToString方法并配置序列化时使用字符串输出。


内容的提问来源于stack exchange,提问作者takeyourcode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:45:47