属性可用于控制Json.NET如何序列化和反序列化.NET对象。

标准.NET序列化属性

除了使用内置的Json.NET属性之外,Json.NET还在确定如何序列化和反序列化JSON时,查找SerializableAttribute(如果DefaultCutractResolver上的IgnoreSerializableAttribute设置为false)DataContractAttribute,DataMemberAttribute和NonSerializedAttribute以及属性。

Json.NET属性优先于标准.NET序列化属性(例如,如果属性上存在JsonPropertyAttribute和DataMemberAttribute,并且都自定义名称,则将使用JsonPropertyAttribute中的名称)。

Json.NET序列化属性

本节包含以下小节:

  • JsonObjectAttribute

  • JsonArrayAttribute/JsonDictionaryAttribute

  • JsonPropertyAttribute

  • JsonIgnoreAttribute

  • JsonConverterAttribute

  • JsonExtensionDataAttribute

  • JsonConstructorAttribute

JsonObjectAttribute

此属性上的MemberSerialization标志指定成员序列化是否为opt-in(成员必须具有要序列化的JsonProperty或DataMember属性),opt-out(默认情况下所有内容都是序列化的,但可以使用JsonIgnoreAttribute忽略,Json.NET的默认值 行为)或字段(所有公共和私有字段都被序列化,属性被忽略)。

可以将此属性上的NamingStrategy设置设置为NamingStrategy类型,该类型指定如何序列化属性名称。

Json.NET将实现IEnumerable的.NET类序列化为填充了IEnumerable值的JSON数组。 放置JsonObjectAttribute会覆盖此行为并强制序列化程序序列化类的字段和属性。

DataContractAttribute可以用作JsonObjectAttribute的替代。 DataContractAttribute将默认成员序列化为opt-in。

JsonArrayAttribute/JsonDictionaryAttribute

JsonArrayAttribute和JsonDictionaryAttribute用于指定是否将类序列化为该集合类型。

集合属性具有自定义JsonConverter,类型名称处理和应用于集合项的引用处理的选项。

JsonPropertyAttribute

JsonPropertyAttribute有许多用途:

  • 默认情况下,JSON属性将与.NET属性具有相同的名称。 此属性允许自定义名称。

  • JsonPropertyAttribute指示当成员序列化设置为opt-in时应该序列化属性。

  • 它包括序列化和反序列化中的非公共属性。

  • 它可用于自定义属性值的类型名称,引用,null和默认值处理。

  • 它可用于自定义序列化属性名称的NamingStrategy。

  • 它可用于自定义属性的集合项JsonConverter,类型名称处理和引用处理。

DataMemberAttribute可以用作JsonPropertyAttribute的替代。

JsonIgnoreAttribute

从序列化中排除字段或属性。

NonSerializedAttribute可以用作JsonIgnoreAttribute的替代。

JsonConverterAttribute

JsonConverterAttribute指定用于转换对象的JsonConverter。

该属性可以放在类或成员上。 放在类上时,属性指定的JsonConverter将是序列化该类的默认方式。 当属性位于字段或属性上时,指定的JsonConverter将始终用于序列化该值。

使用JsonConverter的优先级是成员属性,然后是类属性,最后是传递给JsonSerializer的任何转换器。

此示例显示应用于属性的JsonConverterAttribute。

要将JsonConverter应用于集合中的项,请使用JsonArrayAttribute,JsonDictionaryAttribute或JsonPropertyAttribute,并将ItemConverterType属性设置为要使用的转换器类型。

JsonExtensionDataAttribute

JsonExtensionDataAttribute指示JsonSerializer反序列化属性,并且类型上没有匹配的字段或属性到指定的集合中。 在序列化期间,此集合中的值将写回实例的JSON对象。

即使已经写入了同名的属性,也会在序列化期间写入所有扩展数据值。

此示例显示应用于字段的JsonExtensionDataAttribute,在反序列化期间将不匹配的JSON属性添加到字段的集合中。

Json.NET支持序列化回调方法。 回调可用于在JsonSerializer进行序列化和反序列化之前和之后操作对象。

  • OnSerializing

  • OnSerialized

  • OnDeserializing

  • OnDeserialized

要告诉序列化程序在对象的序列化生命周期中应该调用哪些方法,请使用适当的属性(OnSerializingAttribute,OnSerializedAttribute,OnDeserializingAttribute,OnDeserializedAttribute)修饰方法。

具有序列化回调方法的示例:

Json.NET支持序列化和反序列化期间的错误处理。 错误处理允许您捕获错误并选择是否处理它并继续序列化或让错误冒出来并在应用程序中抛出。

错误处理是通过两种方法定义的:JsonSerializer上的Error事件和OnErrorAttribute。

  • Error Event

  • OnErrorAttribute

Error Event

Error事件是在JsonSerializer上找到的事件处理程序。 只要在序列化或反序列化JSON时抛出异常,就会引发错误事件。 与JsonSerializer上的所有设置一样,它也可以在JsonSerializerSettings上设置并传递给JsonConvert上的序列化方法。

// The string was not recognized as a valid DateTime. There is a unknown word starting at index 0. // Unexpected token parsing date. Expected String, got StartArray. // Cannot convert null value to System.DateTime.

在此示例中,我们将JSON数组反序列化为DateTimes的集合。在JsonSerializerSettings上,已将一个处理程序分配给Error事件,该事件将记录错误消息并将错误标记为已处理。

反序列化JSON的结果是三个成功反序列化的日期和三个错误消息:一个用于格式错误的字符串(“我不是日期并且会出错!”),一个用于嵌套的JSON数组,另一个用于null值,因为该列表不允许可以为空的DateTimes。事件处理程序已记录这些消息,并且Json.NET继续反序列化JSON,因为错误被标记为已处理。

在Json.NET中,错误处理需要注意的一件事是,未处理的错误会冒出来并在其每个父项上引发事件。例如,序列化对象集合时的未处理错误将引发两次,一次针对该对象,然后再次针对该集合。这将允许您处理错误发生的位置或其父节点之一。

如果您没有立即处理错误并且只想对其执行一次操作,那么您可以检查ErrorEventArgs的CurrentObject是否等于OriginalObject。 OriginalObject是抛出错误的对象,而CurrentObject是引发事件的对象。 它们仅在第一次针对OriginalObject引发事件时相等。

OnErrorAttribute

OnErrorAttribute的工作方式与Json.NET支持的其他.NET序列化属性非常相似。 要使用它,只需将属性放在采用正确参数的方法上:StreamingContext和ErrorContext。 方法的名称无关紧要。

在大多数情况下,这是期望的结果,但在某些情况下,将列表中的第二项作为对第一项的引用是更好的解决方案。 如果现在反序列化上面的JSON,那么返回的列表将包含两个具有相同值的完全独立的Person对象。 按值写入引用也会导致出现循环引用的对象出现问题。

PreserveReferencesHandling

设置PreserveReferencesHandling将在序列化和反序列化JSON时跟踪对象引用。

列表中的第一个人是通过添加对象ID序列化的。 JSON中的第二个人现在只是对第一个人的引用。

使用PreserveReferencesHandling,现在在反序列化时只创建一个Person对象,该列表包含两个对它的引用,反映了我们开始使用的内容。

像$ id这样的元数据属性必须位于JSON对象的开头,以便在反序列化期间成功检测到。 如果无法控制JSON对象中的属性顺序,则可以使用MetadataPropertyHandling来删除此限制。

通过非默认构造函数设置值时,无法保留引用。 使用非默认构造函数时,必须在父值之前创建子值,以便将它们传递给构造函数,从而无法进行跟踪引用。 ISerializable类型是一个类的示例,其值使用非默认构造函数填充,并且不能与PreserveReferencesHandling一起使用。

IsReference

JsonSerializer上的PreserveReferencesHandling设置将更改所有对象的序列化和反序列化方式。 对于应该将哪些对象和成员序列化为引用的细粒度控制,JsonObjectAttribute,JsonArrayAttribute和JsonPropertyAttribute上有IsReference属性。

将JsonObjectAttribute或JsonArrayAttribute上的IsReference设置为true将意味着JsonSerializer将始终序列化该属性所针对的类型作为引用。 将JsonPropertyAttribute上的IsReference设置为true将仅将该属性序列化为引用。

CustomCreationConverter

CustomCreationConverter <T> 是一个JsonConverter,它提供了一种在JSON反序列化期间自定义对象创建方式的方法。 一旦创建了对象,它就会被序列化程序填充到它上面。

Json.NET非常支持序列化和反序列化对象集合。

Serializing Collections

要序列化集合 - 通用列表,数组,字典或您自己的自定义集合 - 只需使用要获取JSON的对象调用序列化程序。 Json.NET将序列化集合及其包含的所有值。

以下为json.net的一系列参数设置以及属性设置说明,翻译自官方文档。有错误的地方请指正。Serialization Attributes序列化属性序列化属性属性可用于控制Json.NET如何序列化和反序列化.NET对象。JsonObjectAttribute -放在类上以控制它们应该如何序列化为JSON对象。JsonArrayAttribute -放置在集合上以控... 可以用来控制 Json .NET 如何序列化和反序列化 .NET 对象的特性。 Json Object Attribute -放置在一个类上,以控制如何把类序列化为 JSON 对象。 Json Array Attribute -放置在一个集合上,以控制如何把集合序列化为 JSON 数组。 Json D...
当涉及到跨进程甚至是跨域传输数据的时候,我们需要把对象序列化和反序列化。   首先可以 使用 Serializable特性。   [Serializable] public class Person public string _firstName; public string _secondName; //序列化
public class testdatalistEntity [ Json Property(NullValueHandling = NullValueHandling.Ignore)] public long? id { get; set; } [ Json Property(NullValueHandlin...
CustomCreationConverter是一个在序列化过程中提供自定方式去创建一个对象的 Json 转换器,一旦对象被创建,它将被序列化器填充值。 public interface IPerson string FirstName { get; set; } string LastName { get; set; } DateTime
1.特性的介绍与 使用 特性( Attribute )是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过 使用 特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性的 使用 方法很简单,只需要写在方法,类,枚举,字段等程序体的上面用[]括起来即可,如下。 [Route("api/[controller]/[action]")] [ApiController] public class TestC
一、 JSON 使用 Json Property Attribute 重命名属性名 1.先创建一个Movie对象,然后在其属性上添加 Json Property,并指定重命名的名称。注意:属性Name和Director已指定。 using System; using System.Collections.Generic; using System.Linq; using System.Text;