为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确反序列化具有默认分配的元组属性?

如何正确反序列化具有默认分配的元组属性?

C#
九州编程 2023-08-27 10:39:24
我有一个具有 type 属性的类Tuple<int, int>,该类被分配了默认值(-1, -1)。我还有一个 json 字符串,表示该类的对象,并为元组属性分配了非默认值。当我尝试使用 Json.NET 反序列化 json 字符串时,返回的对象的属性具有默认值。如果我删除类定义中的属性默认分配,则 json 字符串将被正确反序列化。这似乎只发生在元组类型的属性上。例如,我尝试使用字符串属性,反序列化非默认值没有任何问题。如何正确反序列化具有默认值的元组属性?这是我应该在 Json.NET 上报告的错误吗?using System;using Newtonsoft.Json;namespace ConsoleApp1{    public class MyClass    {        public Tuple<int, int> TuplePropertyWithDefault { get; set; } = new Tuple<int, int>(-1, -1);        public string StringPropertyWithDefault { get; set; } = "";        public Tuple<int, int> TuplePropertyWithoutDefault { get; set; }        public string StringPropertyWithoutDefault { get; set; }        public override string ToString()        {            return $"TuplePropertyWithDefault = {TuplePropertyWithDefault}\n" +                    $"TuplePropertyWithoutDefault = {TuplePropertyWithoutDefault}\n" +                    $"StringPropertyWithDefault = {StringPropertyWithDefault}\n" +                    $"StringPropertyWithoutDefault = {StringPropertyWithoutDefault}\n";        }    }    class Program    {        static void Main(string[] args)        {            var expected = new MyClass();            expected.TuplePropertyWithDefault = new Tuple<int, int> (0, 0);            expected.TuplePropertyWithoutDefault = new Tuple<int, int> (0, 0);            expected.StringPropertyWithDefault = "test";            expected.StringPropertyWithoutDefault = "test";            var jsonString = JsonConvert.SerializeObject(expected).ToString();            var deserialized = JsonConvert.DeserializeObject<MyClass>(jsonString);            Console.WriteLine("Expected:");            Console.WriteLine(expected);            Console.WriteLine("Deserialized:");            Console.WriteLine(deserialized);            Console.ReadLine();        }    }}以 .Net Framework 4.7.2 为目标,并使用 Newtonsoft.Json 版本 12.0.2。
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

怀疑这是因为 Json.NET 期望 POCO 子对象是标准的可变类,但该Tuple<...>系列是不可变的

坦率地说,由于命名的原因,无论如何Tuple<...>这里都是一个糟糕的选择,因此:您可能可以通过花费大量时间为 Json.NET 编写自定义代码来配置自己以摆脱这种情况,但是......仅仅声明似乎更务实和明智您自己的具有合适属性的 POCO。

附带说明:值元组是可变的,并且似乎以您期望的方式工作,但是:出于相同的命名原因以及其他原因,我认为它们不会在这里做出好的选择。


查看完整回答
反对 回复 2023-08-27
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信