我正在尝试让对象的属性在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)]
,使用默认值重载构造函数,但没有任何作用。
有什么简单的东西我不想实现这个吗?
答案 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;
只是为了补充一点,如果您只为一个属性分配了任何值的承包商,则会忽略属性初始值设定项(始终)。如果你添加一个默认的构造函数(没有参数),那么我相信你上面的东西将一直有用。