自定义NewtonSoft.Json以进行值对象序列化
有时,也许在DDD情况下,您可能希望使用C#创建值对象来表示数据,为您的域提供比使用原始类型更多的含义,并具有不可变的额外好处。
例如:
public class PostalCode // Bit like a zipcode { public string Value { get; private set; } public PostalCode(string value) { Value = value; } // Maybe sprinkle some ToString()/Equals() overrides here }
布拉沃。 干得好
唯一的事情是,当序列化为Json时,你得到这个:
{ "Value": "W1 AJX" }
那种看起来没问题,但当它被用作对象的属性(让我们说一个地址)时,它看起来像这样:
{ "Line1": "Line1", "Line2": "Line2", "Line3": "Line3", "Town": "Town", "County": "County", "PostalCode": { "Value": "W1 AJX" } }
采取极端,你可以看到这里有很多噪音。 我想做的是告诉Newtonsoft.Json,当它看到一种类型的PostalCode
时,它可以将它序列化为字符串值(反之亦然)。 这将导致以下json:
{ "Line1": "Line1", "Line2": "Line2", "Line3": "Line3", "Town": "Town", "County": "County", "PostalCode": "W1 AJX" }
这可以实现吗? 我已经浏览了文档,我怀疑自定义JsonConverter
可能是前进的方向吗?
public class PostalCode // Bit like a zipcode { [JsonProperty(PropertyName = "PostalCode")] public string Value { get; set; } // Maybe sprinkle some ToString()/Equals() overrides here }
我想这是你的答案?
你能利用implicit operator
语法吗?
https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx
public class PostalCode { public string Value { get; private set; } public PostalCode(string value) { this.Value = value; } public static implicit operator string(PostalCode result) { return result.Value; } } var postCode = new PostalCode("WN11 2PZ"); Console.Output(postCode); // "WN11 2PZ"
我没有测试过,所以我可能会离开!
看一下自定义JsonConverter的示例代码: http : //www.newtonsoft.com/json/help/html/JsonConverterAttributeClass.htm
该示例处理与您类似的问题。