請考慮將您的值類型更改爲可爲空的數據類型,並將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":[]}]}
我不想忽略這些屬性。我想序列化他們,如果他們有非默認值。 – 2013-02-14 23:02:06
所有非默認公共屬性都會自動序列化。如果你想重新使用EF ORM模型作爲DTO的話,那麼[你正在走向一個受到傷害的世界](http://www.infoq.com/articles/interview-servicestack)。爲任務創建顯式的DTO,並使用ServiceStack內置的'TFrom.TranslateTo(或'To.PopulateFrom(from)'自動映射器。 – mythz 2013-02-14 23:12:39
是的,但默認的複雜屬性是序列化的,甚至很難包含默認值,就像我的例子。 – 2013-02-15 12:37:21