自定义NewtonSoft.Json以进行值对象序列化

时间:2017-05-04 10:58:36

标签: c# serialization json.net

有时,也许在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可能是前进的方向吗?

3 个答案:

答案 0 :(得分:0)

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

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

我认为这是你的答案?

答案 1 :(得分:-1)

您能否利用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"

我还没有对此进行测试,所以我可以离开!

答案 2 :(得分:-1)

查看自定义JsonConverter的示例代码:http://www.newtonsoft.com/json/help/html/JsonConverterAttributeClass.htm

该示例处理与您类似的问题。