请考虑将您的值类型更改为可为空的数据类型,并将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