2013-02-14 53 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":[]}]} 
相关问题