在使用ServiceStack json进行序列化期间,是否有方法忽略默认值?
我使用实体框架作为我的ORM。它具有在使用ServiceStack json进行序列化期间,是否有方法忽略默认值?,json,
servicestack,Json,
servicestack,我使用实体框架作为我的ORM。它具有ComplexTypeAttribute(用于注释POCO)。复杂类型的属性总是实例化(使用默认构造函数),而不管其值如何;因此,总是由ServiceStackJsonSerializer序列化(以及它们的属性) JSON.NET有一个名为DefaultValueHandling的枚举,可以在这些情况下使用 ServiceStack有类似的功能吗 例如: class Person { string Name { get; set; } Addres
ComplexTypeAttribute
(用于注释POCO)。复杂类型的属性总是实例化(使用默认构造函数),而不管其值如何;因此,总是由ServiceStackJsonSerializer
序列化(以及它们的属性)
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设置为Ignore,我只会得到
"{ Name: Jim }"
是的,这里有不同的方法 序列化程序也可以
类显示所有可能的自定义。
< P>请考虑将值类型更改为可空数据类型,并将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型的“Age”吗?当它为空时,从序列化输出中省略。该示例还演示了使用匿名对象的序列化
示例如下:
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();
}
}
}
我不想忽略这些属性。如果它们有非默认值,我想序列化它们。所有非默认公共属性都会自动序列化。如果您想将EF ORM模型作为DTO重复使用,也可以这样做。为任务创建显式DTO,并使用ServiceStack的内置
TFrom.TranslateTo()
或To.PopulateFrom(from)
自动映射器。是的,但默认复杂属性是序列化的,即使很难,它们也只包含默认值,如我的示例所示。只有当它们非空时,即如预期的那样,才会被序列化。我们没有“如果一个类只有默认值的属性,就不要序列化”,但是我们有我上面列出的自定义序列化钩子,这可能会有所帮助。??即使有一个空实例,它仍然必须检查每个属性,以检查两个类是否具有相同的形状/值。此外,您的问题具有误导性—您要求与引用类型的新实例相等,引用类型是使用无参数构造函数创建的,而不是默认值类型default(T)
或ref类型(为null)。
{"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":[]}]}