使用DefaultValueHandling的Newtonsoft json DeserializeObject不使用运行时对象

时间:2017-05-25 17:02:28

标签: c# json json.net default-value json-deserialization

我正在尝试让对象的属性在json中没有该属性时返回默认值我反序列化。

我读到我可以使用[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]属性实现此目的。

    public class MyClass {
        public readonly string Id;
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
        public RectangleF Position { get; set; } = new RectangleF(0, 0, 1, 1);

        [JsonConstructor]
        public MyClass(string id, RectangleF position) {
            Id = id;
            Position = position;
        }
    }

    [Test]
    public void DeserializeDefaultValue() {
        var json = JObject.FromObject(new { id = "123" });
        var obj = json.ToObject<MyClass>();
        Expect(obj.Position, Is.EqualTo(new RectangleF(0, 0, 1, 1)));
    }

测试失败,位置始终返回new RectangleF(0, 0, 0, 0)

我不能拥有[DefaultValue]属性,就像我在很多例子中看到的那样,因为RectangleF是在运行时初始化的。

我尝试了很多东西,例如在构造函数中使用[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)],使用默认值重载构造函数,但没有任何作用。

有什么简单的东西我不想实现这个吗?

1 个答案:

答案 0 :(得分:1)

所以我修改了你正在做的事情,但这适用于你想要完成的事情。

// Login
  $bindata .= pack('sX',0x01);
  $length = (strlen($username) + 6);
  $length = dechex($length);
  print '>>> DEBUG LOGIN LENGTH: '.$length."\r\n";
  $bindata .= pack('sX',$length); //hex  length of string +6 
  $bindata .= pack('sX',0x00);
  $bindata .= pack('sX',0x05);
  $bindata .= "login";
  $bindata .= $username;

只是为了补充一点,如果您只为一个属性分配了任何值的承包商,则会忽略属性初始值设定项(始终)。如果你添加一个默认的构造函数(没有参数),那么我相信你上面的东西将一直有用。