Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用ServiceStack json进行序列化期间,是否有方法忽略默认值?_Json_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Json,servicestack" /> servicestack,Json,servicestack" />

在使用ServiceStack json进行序列化期间,是否有方法忽略默认值?

在使用ServiceStack json进行序列化期间,是否有方法忽略默认值?,json,servicestack,Json,servicestack,我使用实体框架作为我的ORM。它具有ComplexTypeAttribute(用于注释POCO)。复杂类型的属性总是实例化(使用默认构造函数),而不管其值如何;因此,总是由ServiceStackJsonSerializer序列化(以及它们的属性) JSON.NET有一个名为DefaultValueHandling的枚举,可以在这些情况下使用 ServiceStack有类似的功能吗 例如: class Person { string Name { get; set; } Addres

我使用实体框架作为我的ORM。它具有
ComplexTypeAttribute
(用于注释POCO)。复杂类型的属性总是实例化(使用默认构造函数),而不管其值如何;因此,总是由ServiceStack
JsonSerializer
序列化(以及它们的属性)

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":[]}]}