2017-05-04 55 views
2

有时,也许在DDD情况下,您可能希望使用C#创建值对象来表示数据,为您的域赋予比使用基本类型更多的含义,并带来额外的好处是不可改变的。为值对象自定义NewtonSoft.Json对象序列化

例如:

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可能是前进的方向?

+0

我在“重复”问题中回答,https://stackoverflow.com/a/48005782/442459。我不相信这些问题是完全一样的。但答案有一个通用的方法来解决这个问题。 – Lejdholt

回答

0

您可以利用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" 

我没有测试过这个,所以我可以的路要走!

+0

这是如何改变Newtonsoft JSON序列化程序的行为的? – rene

+0

它没有,但它可能会导致序列化程序返回邮政编码字符串而不是新对象。 – Tom

0
public class PostalCode // Bit like a zipcode 
{ 
    [JsonProperty(PropertyName = "PostalCode")] 
    public string Value { get; set; } 

    // Maybe sprinkle some ToString()/Equals() overrides here 
} 

我想这是你的答案?

+0

当然,这是一个很好的答案。虽然我宁愿避免将json.net属性放在类上,但从技术上讲,它们并不知道序列化等事情。像这样使用的属性基本上是一个漏洞抽象,但我很欣赏这个答案的简单性。 –

相关问题