2013-02-14 80 views
4

我正在使用實體框架作爲我的ORM。它有ComplexTypeAttribute(用於註釋POCO)。無論它們的值如何,複雜類型的屬性總是被實例化(使用默認構造函數);因此,總是通過ServiceStack JsonSerializer(以及它們的屬性)進行序列化。有沒有辦法在使用ServiceStack json序列化時忽略默認值?

JSON.NET有一個名爲DefaultValueHandling的枚舉,它可以在這些情況下使用。

ServiceStack有類似的東西嗎?

例如:

class Person 
{ 
    string Name { get; set; } 
    Address Address { get; set; } 
} 

[ComplexType] 
class Address 
{ 
    string Street { get; set; } 
    int Number { get; set; } 
    int PostalCode { get; set; } 
} 

當我序列化一個人在沒有地址,我得到這樣的:

"{ Name: Jim, Address : { Number: 0, PostalCode: 0 } }" 

在Json.Net如果我設置DefaultValueHandling不理,我只得到

"{ Name: Jim }" 

回答

4

是的,這裏有不同的方法可以ignore properties with ServiceStack's JSON and Text serializers

序列化器也是support multiple hooks to customize serialization and deserialization

JsConfig類顯示所有可能的自定義。

+0

我不想忽略這些屬性。我想序列化他們,如果他們有非默認值。 – 2013-02-14 23:02:06

+0

所有非默認公共屬性都會自動序列化。如果你想重新使用EF ORM模型作爲DTO的話,那麼[你正在走向一個受到傷害的世界](http://www.infoq.com/articles/interview-servicestack)。爲任務創建顯式的DTO,並使用ServiceStack內置的'TFrom.TranslateTo(或'To.PopulateFrom(from)'自動映射器。 – mythz 2013-02-14 23:12:39

+0

是的,但默認的複雜屬性是序列化的,甚至很難包含默認值,就像我的例子。 – 2013-02-15 12:37:21

1

請考慮將您的值類型更改爲可爲空的數據類型,並將null設置爲任何引用類型的默認值。

class Person 
{ 
    string Name { get; set; } 
    Address Address { get; set; } 
} 

[ComplexType] 
class Address 
{ 
    string Street { get; set; } 
    int? Number { get; set; } 
    int? PostalCode { get; set; } 
} 

這應該有助於您擺脫具有默認值的屬性,因爲ServiceStack文本將省略具有空值的屬性。還請注意,「年齡」是int類型的嗎?當它爲空時,從串行輸出中省略。該示例還演示了使用匿名對象進行序列化。下面

例子:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using ServiceStack; 

namespace JsonTest 
{ 
    class Person 
    { 
     public string Name { get; set; } 
     public string Address { get; set; } 
     public int? Age { get; set; } 
     public List<Person> Children { get; set; } 

     public Person() 
     { 
      Children = new List<Person>(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var c1 = new Person { Name = "John", Address = "USA", Age = null }; 
      var c2 = new Person { Name = "John", Address = "USA", Age = 12 }; 
      List<Person> children = new List<Person>(); 
      children.Add(c1); 
      string name = "Jim"; 
      // Uncomment lines below and check - Children attribute is omitted from JSON result 
      // children = null; 
      // name = null; 
      var p1 = new { Name = name, Address = "USA", Age=40, Children = children}; 
      var p2 = new Person { Name = "Jim", Address = "USA" , Age = null}; 
      p2.Children.Add(c2); 
      Console.WriteLine(p1.ToJson()); 
      Console.WriteLine(p2.ToJson()); 
      Console.ReadLine(); 
     } 
    } 
} 

輸出:

{"Name":"Jim","Address":"USA","Age":40,"Children":[{"Name":"John","Address":"USA","Children":[]}]} 
{"Name":"Jim","Address":"USA","Children":[{"Name":"John","Address":"USA","Age":12,"Children":[]}]} 

{"Address":"USA","Age":40} 
{"Name":"Jim","Address":"USA","Children":[{"Name":"John","Address":"USA","Age":12,"Children":[]}]} 
相關問題