Eigenständige JSON-Serialisierung.Stand-Alone JSON Serialization

JSON (JavaScript Object Notation) ist ein Datenformat, das speziell zur Verwendung von JavaScript-Code entworfen wurde, der auf Webseiten innerhalb des Browsers ausgeführt wird.JSON (JavaScript Object Notation) is a data format that is specifically designed to be used by JavaScript code running on Web pages inside the browser. Es ist das Standarddatenformat, die von ASP.NET AJAX-Diensten in Windows Communication Foundation (WCF) erstellt.It is the default data format used by ASP.NET AJAX services created in Windows Communication Foundation (WCF).

Dieses Format kann auch für AJAX-Dienste verwendet werden, die nicht in ASP.NET integriert sind. In diesem Fall ist zwar XML der Standard, jedoch kann JSON gewählt werden.This format can also be used when creating AJAX services without integrating with ASP.NET - in this case, XML is the default but JSON can be chosen.

Und wenn Sie schließlich JSON-Unterstützung benötigen, aber keinen AJAX-Dienst erstellen, ermöglicht Ihnen der DataContractJsonSerializer, .NET-Objekte direkt in JSON-Daten zu serialisieren und diese Daten wieder in Instanzen von .NET-Typen zu deserialisieren.Finally, if you require JSON support but are not creating an AJAX service, the DataContractJsonSerializer makes it possible to directly serialize .NET objects into JSON data and to deserialize such data back into instances of .NET types. Eine Beschreibung hierzu finden Sie in wie: Serialisieren und Deserialisieren von JSON-Daten.For a description of how to do this, see How to: Serialize and Deserialize JSON Data.

Bei der Arbeit mit JSON werden mit wenigen Ausnahmen dieselben .NET-Typen unterstützt, die auch vom DataContractSerializer unterstützt werden.When working with JSON, the same .NET types are supported, with a few exceptions, as are supported by the DataContractSerializer. Eine Liste der unterstützten Typen finden Sie Typen unterstützt, durch den Datenvertragsserialisierer.For a list of the types supported, see Types Supported by the Data Contract Serializer. Dazu gehören die meisten primitiven Typen, die meisten Array- und Auflistungstypen sowie die komplexen Typen, die das DataContractAttribute und das DataMemberAttribute verwenden.This includes most primitive types, most array and collection types, as well as complex types that use the DataContractAttribute and DataMemberAttribute.

Zuordnung von .NET-Typen zu JSON-TypenMapping .NET types to JSON Types

Die folgende Tabelle zeigt die Entsprechungen zwischen .NET-Typen und JSON/JavaScript-Typen, die für die Zuordnung während der Serialisierung und Deserialisierung gelten.The following table shows the correspondence between .NET types and JSON/JavaScript types when mapped by serialization and deserialization procedures.

.NET-Typen.NET Types JSON/JavaScriptJSON/JavaScript HinweiseNotes
Alle numerischen Typen, z. B. Int32, Decimal oder DoubleAll numeric types, for example Int32, Decimal or Double AnzahlNumber Spezielle Werte, z. B. Double.NaN, Double.PositiveInfinity und Double.NegativeInfinity werden nicht unterstützt und führen zu ungültigen JSON-Daten.Special values such as Double.NaN, Double.PositiveInfinity and Double.NegativeInfinity are not supported and result in invalid JSON.
Enum AnzahlNumber Siehe "Enumerationen und JSON" weiter unten in diesem Thema.See "Enumerations and JSON" later in this topic.
Boolean BooleschBoolean --
String, CharString, Char ZeichenfolgeString --
TimeSpan, Guid, UriTimeSpan, Guid, Uri ZeichenfolgeString Das Format dieser Typen im JSON-Format ist der gleiche wie in XML (im Wesentlichen TimeSpan in den ISO 8601-Zeitformat, GUID im Format "12345678-ABCD-ABCD-ABCD-1234567890AB" und URI in seiner natürlichen Form als Zeichenfolge wie "http://www.example.com").The format of these types in JSON is the same as in XML (essentially, TimeSpan in the ISO 8601 Duration format, GUID in the "12345678-ABCD-ABCD-ABCD-1234567890AB" format and URI in its natural string form like "http://www.example.com"). Genaue Informationen finden Sie unter Datenvertrags-Schemareferenz.For precise information, see Data Contract Schema Reference.
XmlQualifiedName ZeichenfolgeString Das Format ist "name:namespace" (sämtliche Zeichen vor dem ersten Doppelpunkt bilden den Namen).The format is "name:namespace" (anything before the first colon is the name). Der Name oder der Namespace kann fehlen.Either the name or the namespace can be missing. Wenn kein Namespace angegeben wird, kann auch der Doppelpunkt weggelassen werden.If there is no namespace the colon can be omitted as well.
Array vom Typ ByteArray of type Byte Array von ZahlenArray of numbers Jede Zahl stellt den Wert eines Bytes dar.Each number represents the value of one byte.
DateTime DateTime oder ZeichenfolgeDateTime or String Siehe "Datums-/Uhrzeitangaben und JSON" weiter unten in diesem Thema.See Dates/Times and JSON later in this topic.
DateTimeOffset Komplexer TypComplex type Siehe "Datums-/Uhrzeitangaben und JSON" weiter unten in diesem Thema.See Dates/Times and JSON later in this topic.
XML- und ADO.NET-Typen (XmlElement,XML and ADO.NET types (XmlElement,

XElementXElement. Arrays von XmlNode,Arrays of XmlNode,

ISerializable,ISerializable,

DataSet) angezeigt wird.DataSet).
ZeichenfolgeString Siehe den Abschnitt "XML-Typen und JSON" in diesem Thema.See the XML Types and JSON section of this topic.
DBNull Leerer komplexer TypEmpty complex type --
Auflistungen, Wörterbücher und ArraysCollections, dictionaries, and arrays ArrayArray Siehe den Abschnitt "Auflistungen, Wörterbücher und Arrays" in diesem Thema.See the Collections, Dictionaries, and Arrays section of this topic.
Komplexe Typen (mit angewendetem DataContractAttribute oder SerializableAttribute)Complex types (with the DataContractAttribute or SerializableAttribute applied) Komplexer TypComplex type Datenmember werden Member des komplexen JavaScript-Typs.Data members become members of the JavaScript complex type.
Komplexe Typen (die die ISerializable-Schnittstelle implementieren)Complex types implementing the ISerializable interface) Komplexer TypComplex type Entspricht anderen komplexen Typen, jedoch werden einige ISerializable-Typen nicht unterstützt. Weitere Informationen finden Sie in den Hinweisen zur ISerializable-Unterstützung im Abschnitt "Weitere Informationen" in diesem Thema.Same as other complex types but some ISerializable types are not supported – see the ISerializable Support part of the Advanced Information section of this topic.
Null-Wert für jeden TypNull value for any type NullNull Typen, die NULL-Werte zulassen, werden ebenfalls unterstützt und JSON-Typen auf die gleiche Weise zugeordnet wie nicht auf NULL festlegbare Typen.Nullable types are also supported and map to JSON in the same way as non-nullable types.

Enumerationen und JSONEnumerations and JSON

Enumerationsmemberwerte werden in JSON als Zahlen behandelt. Dies unterscheidet sich von ihrer Behandlung in Datenverträgen, in die sie als Membernamen eingefügt werden.Enumeration member values are treated as numbers in JSON, which is different from how they are treated in data contracts, where they are included as member names. Weitere Informationen zur Behandlung Vertrag Daten finden Sie unter Enumerationstypen in Datenverträgen.For more information about the data contract treatment, see Enumeration Types in Data Contracts.

  • Wenn beispielsweise public enum Color {red, green, blue, yellow, pink} gegeben ist, ergibt die Serialisierung von yellow die Zahl 3 und nicht die Zeichenfolge "yellow".For example, if you have public enum Color {red, green, blue, yellow, pink}, serializing yellow produces the number 3 and not the string "yellow".

  • Alle enum-Member sind serialisierbar.All enum members are serializable. Die EnumMemberAttribute-Klasse und die NonSerializedAttribute-Attribute werden ignoriert, wenn sie verwendet werden.The EnumMemberAttribute and the NonSerializedAttribute attributes are ignored if used.

  • Es ist möglich, einen nicht vorhandenen enum-Wert zu deserialisieren. Der Wert 87 kann z. B. in den vorherigen Farbenumerationswert deserialisiert werden, auch wenn kein entsprechender Farbname definiert ist.It is possible to deserialize a nonexistent enum value - for example, the value 87 can be deserialized into the previous Color enum even though there is no corresponding color name defined.

  • Eine enum aus Flags stellt keinen Sonderfall dar und wird wie jede andere enum behandelt.A flags enum is not special and is treated the same as any other enum.

Datums-/Uhrzeitangaben und JSONDates/Times and JSON

Das JSON-Format unterstützt Datums- und Zeitangaben nicht direkt.The JSON format does not directly support dates and times. Jedoch werden sie sehr häufig verwendet, und ASP.NET AJAX bietet eine spezielle Unterstützung dieser Typen.However, they are very commonly used and ASP.NET AJAX provides special support for these types. Werden ASP.NET AJAX-Proxys verwendet, entspricht der DateTime-Typ in .NET vollständig dem DateTime-Typ in JavaScript.When using ASP.NET AJAX proxies, the DateTime type in .NET fully corresponds to the DateTime type in JavaScript.

  • Wird ASP.NET nicht verwendet, wird ein DateTime-Typ in JSON durch ein spezielles Zeichenfolgenformat dargestellt, das im Abschnitt "Weitere Informationen" in diesem Thema beschrieben wird.When not using ASP.NET, a DateTime type is represented in JSON as a string with a special format that is described in the Advanced Information section of this topic.

  • DateTimeOffset wird in JSON als komplexer Typ dargestellt: {"DateTime":dateTime,"OffsetMinutes":offsetMinutes}.DateTimeOffset is represented in JSON as a complex type: {"DateTime":dateTime,"OffsetMinutes":offsetMinutes}. Der offsetMinutes-Member gibt den mit der Position des Ereignisses von Interesse verbundenen Ortszeitoffset zur GMT (Greenwich Mean Time) an. GMT wird jetzt auch als UTC (Coordinated Universal Time) bezeichnet.The offsetMinutes member is the local time offset from Greenwich Mean Time (GMT), also now referred to as Coordinated Universal Time (UTC), associated with the location of the event of interest. Der dateTime-Member gibt den Zeitpunkt an, zu dem das betreffende Ereignis eingetreten ist (er wird wieder in einen DateTime-Typ in JavaScript umgewandelt, wenn ASP.NET AJAX verwendet wird; andernfalls wird er in eine Zeichenfolge umgewandelt).The dateTime member represents the instance in time when the event of interest occurred (again, it becomes a DateTime in JavaScript when ASP.NET AJAX is in use and a string when it is not). Bei der Serialisierung wird der dateTime-Member immer in GMT serialisiert.On serialization, the dateTime member is always serialized in GMT. Wenn beispielsweise die Uhrzeit 3:00 AM in der Zeitzone von New York beschrieben wird, dann enthält dateTime die Zeitangabe "8:00 AM" und offsetMinutes den Wert "300" (minus 300 Minuten oder 5 Stunden gegenüber GMT).So, if describing 3:00 AM New York time, dateTime has a time component of 8:00 AM and offsetMinutes are 300 (minus 300 minutes or 5 hours from GMT).

    Hinweis

    Werden die Objekte DateTime und DateTimeOffset zu JSON serialisiert, behalten sie die Informationen nur mit Millisekundengenauigkeit bei.DateTime and DateTimeOffset objects, when serialized to JSON, only preserve information to millisecond precision. Werte, die kleiner als Millisekunden (Mikro-/Nanosekunden) sind, gehen bei der Serialisierung verloren.Sub-millisecond values (micro/nanoseconds) are lost during serialization.

XML-Typen und JSONXML Types and JSON

XML-Typen werden zu JSON-Zeichenfolgen.XML types become JSON strings.

  • Wenn ein Datenmember "Q" von "XElement" Geben Sie z. B. enthält <Abc / >, wird die JSON {"Q": "<Abc / >"}.For example, if a data member "q" of type XElement contains <abc/>, the JSON is {"q":"<abc/>"}.

  • Es gibt einige spezielle Regeln, die festlegen, wie XML eingebunden wird. Nähere Informationen dazu finden Sie im Abschnitt "Weitere Informationen" weiter unten in diesem Thema.There are some special rules that specify how XML is wrapped - for more information, see the Advanced Information section later in this topic.

  • Wenn Sie mit ASP.NET AJAX arbeiten und in JavaScript keine Zeichenfolgen, sondern XML DOM verwenden möchten, legen Sie die ResponseFormat-Eigenschaft für WebGetAttribute oder die ResponseFormat-Eigenschaft für WebInvokeAttribute auf XML fest.If you are using ASP.NET AJAX and do not want to use strings in the JavaScript, but want the XML DOM instead, set the ResponseFormat property to XML on WebGetAttribute or the ResponseFormat property to XML on the WebInvokeAttribute.

Auflistungen, Wörterbücher und ArraysCollections, Dictionaries and Arrays

Alle Auflistungen, Wörterbücher und Arrays werden in JSON als Arrays dargestellt.All collections, dictionaries, and arrays are represented in JSON as arrays.

  • Jede Anpassung, in der das CollectionDataContractAttribute verwendet wird, wird in der JSON-Darstellung ignoriert.Any customization that uses the CollectionDataContractAttribute is ignored in the JSON representation.

  • Wörterbücher stellen keine Möglichkeit dar, JSON-Daten direkt zu bearbeiten.Dictionaries are not a way to work directly with JSON. Wörterbuch<string, object > möglicherweise nicht auf die gleiche Weise in WCF unterstützt werden, wie erwartet funktioniert mit anderen JSON-Technologien.Dictionary<string,object> may not be supported in the same way in WCF as expected from working with other JSON technologies. Wird beispielsweise in einem Wörterbuch "abc" dem Wert "xyz" und "def" dem Wert 42 zugeordnet, dann lautet die JSON-Darstellung nicht {"abc":"xyz","def":42}, sondern [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}].For example, if "abc" is mapped to "xyz" and "def" is mapped to 42 in a dictionary, the JSON representation is not {"abc":"xyz","def":42} but is [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}] instead.

  • Wenn Sie direkt mit JSON arbeiten möchten (also ohne vorher definierten strengen Vertrag auf Schlüssel und Werte dynamisch zugreifen möchten), stehen Ihnen mehrere Optionen zur Verfügung:If you would like to work with JSON directly (accessing keys and values dynamically, without pre-defining a rigid contract), you have several options:

    • Erwägen Sie die schwach typisierten JSON-Serialisierung (AJAX) Beispiel.Consider using the Weakly-typed JSON Serialization (AJAX) sample.

    • Verwenden Sie die ISerializable-Schnittstelle und des Serialisierungskonstruktors. Diese beiden Mechanismen ermöglichen es Ihnen, bei der Serialisierung und der Deserialisierung auf JSON-Schlüssel/Wert-Paare zuzugreifen, was jedoch in teilweise vertrauenswürdigen Szenarien nicht möglich ist.Consider using the ISerializable interface and deserialization constructors - these two mechanisms allow you to access JSON key/value pairs on serialization and deserialization respectively, but do not work in partial trust scenarios.

    • Verwenden Sie den mit der Zuordnung zwischen JSON und XML- anstelle eines Serialisierungsprogramms.Consider working with the Mapping Between JSON and XML instead of using a serializer.

    • Polymorphismus im Zusammenhang mit Serialisierung bezieht sich auf die Möglichkeit, einen abgeleiteten Typ zu serialisieren, wo sein Basistyp erwartet wird.Polymorphism in the context of serialization refers to the ability to serialize a derived type where its base type is expected. Es gelten spezielle JSON-spezifische Regeln für die polymorphe Verwendung von Auflistungen (beispielsweise die Zuweisung einer Auflistung zu einem Object.There are special JSON-specific rules when using collections polymorphically, when, for example, assigning a collection to an Object. Dieser Punkt wird ausführlicher im Abschnitt "Weitere Informationen" weiter unten in diesem Thema erläutert.This issue is more fully discussed in the Advanced Information section later in this topic.

Weitere DetailsAdditional Details

Reihenfolge der DatenmemberOrder of Data Members

Die Reihenfolge der Datenmember ist bei Verwendung von JSON nicht von Bedeutung.Order of data members is not important when using JSON. Insbesondere gilt: Auch wenn Order festgelegt wird, können die JSON-Daten immer noch in jeder beliebigen Reihenfolge deserialisiert werden.Specifically, even if Order is set, JSON data can still be deserialized in any order.

JSON-TypenJSON Types

Der JSON-Typ muss bei der Deserialisierung nicht mit der vorangehenden Tabelle übereinstimmen.The JSON type does not have to match the preceding table on deserialization. Beispielsweise wird ein Wert vom Typ Int normalerweise einer JSON-Zahl zugeordnet, aber er kann auch aus einer JSON-Zeichenfolge deserialisiert werden, sofern diese Zeichenfolge eine gültige Zahl enthält.For example, an Int normally maps to a JSON number, but it can also be successfully deserialized from a JSON string as long as that string contains a valid number. Daher ist sowohl {"q":42} als auch {"q":"42"} zulässig, wenn ein Int-Datenmember namens "q" vorhanden ist.That is, both {"q":42} and {"q":"42"} are valid if there is an Int data member called "q".

PolymorphismusPolymorphism

Polymorphe Serialisierung besteht aus der Fähigkeit, einen abgeleiteten Typ zu serialisieren, wo sein Basistyp erwartet wird.Polymorphic serialization consists of the ability to serialize a derived type where its base type is expected. Dies wird für die JSON-Serialisierung von WCF-vergleichbar sein, um die Methode unterstützt, die XML-Serialisierung unterstützt wird.This is supported for JSON serialization by WCF comparable to the way XML serialization is supported. Sie können z. B. Serialisieren MyDerivedType , in denen MyBaseType ist erwartet wird, oder Int , in denen Object wird erwartet.For example, you can serialize MyDerivedType where MyBaseType is expected, or serialize Int where Object is expected.

Typinformationen gehen möglicherweise verloren, wenn ein abgeleiteter Typ deserialisiert wird, wo der Basistyp erwartet wird, es sei denn, Sie deserialisieren einen komplexen Typ.Type information may be lost when deserializing a derived type if the base type is expected, unless you are deserializing a complex type. Wenn z. B. ein Uri serialisiert wird, wo ein Object erwartet wird, ergibt sich daraus eine JSON-Zeichenfolge.For example, if Uri is serialized where Object is expected, it results in a JSON string. Wenn diese Zeichenfolge dann wieder in Object zurück deserialisiert wird, wird ein .NET String zurückgegeben.If this string is then deserialized back into Object, a .NET String is returned. Das Deserialisierungsprogramm weiß nicht, dass die Zeichenfolge ursprünglich den Typ Uri hatte.The deserializer does not know that the string was initially of type Uri. Allgemein gilt: Wird ein Object erwartet, werden alle JSON-Zeichenfolgen als .NET-Zeichenfolgen und alle JSON-Arrays, die zur Serialisierung von .NET-Auflistungen, -Wörterbüchern und -Arrays verwendet wurden, als .NET Array des Typs Object deserialisiert, unabhängig davon, welchen ursprünglichen Typ sie hatten.Generally, when expecting Object, all JSON strings are deserialized as .NET strings, and all JSON arrays used to serialize .NET collections, dictionaries, and arrays are deserialized as .NET Array of type Object, regardless of what the actual original type had been. Der JSON-Typ boolean wird dem .NET-Typ Boolean zugeordnet.A JSON boolean maps to a .NET Boolean. Wenn jedoch ein Object erwartet wird, dann werden JSON-Zahlen in einen der .NET-Typen Int32, Decimal oder Double serialisiert, wobei automatisch der am besten geeignete Typ ausgewählt wird.However when expecting an Object, JSON numbers are deserialized as either .NET Int32, Decimal or Double, where the most appropriate type is automatically picked.

Beim Deserialisieren in einen Schnittstellentyp, deserialisiert der DataContractJsonSerializer die Daten so, als wäre ein Objekt als Typ deklariert.When deserializing into an interface type, the DataContractJsonSerializer deserializes as if the declared type were object.

Wenn Sie mit Ihren eigenen Basistyp und abgeleiteten Typen arbeiten, ist normalerweise die Verwendung von KnownTypeAttribute, ServiceKnownTypeAttribute oder eines äquivalenten Mechanismus erforderlich.When working with your own base and derived types, using the KnownTypeAttribute, ServiceKnownTypeAttribute or an equivalent mechanism is normally required. Z. B., wenn Sie einen Vorgang über die verfügt ein Animal Rückgabewert und es tatsächlich gibt eine Instanz von Cat (abgeleitet Animal), sollten Sie entweder übernehmen die KnownTypeAttribute, zu der Animal Typ oder die ServiceKnownTypeAttribute zu der Vorgang, und geben Sie die Cat Geben Sie diese Attribute.For example, if you have an operation that has an Animal return value and it actually returns an instance of Cat (derived from Animal), you should either apply the KnownTypeAttribute, to the Animal type or the ServiceKnownTypeAttribute to the operation and specify the Cat type in these attributes. Weitere Informationen finden Sie unter Datenvertragstypen bezeichnet.For more information, see Data Contract Known Types.

Weitere Informationen zur polymorphen Serialisierung und der Einschränkungen, die Sie bei der Verwendung beachten müssen, finden Sie im Abschnitt "Weitere Informationen" weiter unten in diesem Thema.For details of how polymorphic serialization works and a discussion of some of the limitations that must be respected when using it, see the Advanced Information section later in this topic.

VersionskontrolleVersioning

Die Datenvertragsversionsfunktionen werden einschließlich der IExtensibleDataObject-Schnittstelle in JSON vollständig unterstützt.The data contract versioning features, including the IExtensibleDataObject interface, are fully supported in JSON. Darüber hinaus ist es in den meisten Fällen möglich, einen Typ in ein Format (beispielsweise XML) zu deserialisieren, es dann in ein anderes Format (beispielsweise JSON) zu serialisieren und die Daten in IExtensibleDataObject beizubehalten.Furthermore, in most cases it is possible to deserialize a type in one format (for example, XML) and then serialize it into another format (for example, JSON) and still preserve the data in IExtensibleDataObject. Weitere Informationen finden Sie unter Aufwärtskompatible Datenverträge.For more information, see Forward-Compatible Data Contracts. Denken Sie daran, dass JSON ungeordnet ist und daher alle Reihenfolgeninformationen verloren gehen.Remember that JSON is unordered so any order information is lost. .JSON unterstützt auch keine mehrfachen Schlüssel/Wert-Paare mit dem gleichen Schlüsselnamen.Furthermore, JSON does not support multiple key/value pairs with the same key name. Und schließlich sind alle Vorgänge mit IExtensibleDataObject grundsätzlich polymorph. Das bedeutet, dass ihr abgeleiteter Typ Object zugewiesen ist, dem Basistyp aller Typen.Finally, all operations on IExtensibleDataObject are inherently polymorphic - that is their derived type are assigned to Object, the base type for all types.

JSON in URLsJSON in URLs

Bei Verwendung von ASP.NET AJAX-Endpunkten mit dem HTTP-GET-Verb (wobei das WebGetAttribute-Attribut verwendet wird) werden eingehende Parameter in der Anforderungs-URL statt im Nachrichtentext angegeben.When using ASP.NET AJAX endpoints with the HTTP GET verb (using the WebGetAttribute attribute), incoming parameters appear in the request URL instead of the message body. JSON wird auch in der Anforderungs-URL unterstützt, wenn Sie einen Vorgang haben, verwendet ein Int namens "Number" und eine Person komplexer Typ namens "p", die URL sieht in etwa die folgende URL aus.JSON is supported even in the request URL, so if you have an operation that takes an Int called "number" and a Person complex type called "p", the URL may resemble the following URL.

http://example.com/myservice.svc/MyOperation?number=7&p={"name":"John","age":42}  

Wenn Sie ein ASP.NET AJAX Script-Manager-Steuerelement und einen Proxy für den Aufruf des Diensts verwenden, wird diese URL automatisch vom Proxy erstellt und nicht erkannt.If you are using an ASP.NET AJAX Script Manager control and proxy to call the service, this URL is automatically generated by the proxy and is not seen. JSON kann nicht in URLs auf Nicht-ASP.NET AJAX-Endpunkten verwendet werden.JSON cannot be used in URLs on non-ASP.NET AJAX endpoints.

Weitere InformationenAdvanced information

ISerializable-UnterstützungISerializable Support

Unterstützte und nicht unterstützte ISerializable-TypenSupported and Unsupported ISerializable Types

Im Allgemeinen werden Typen, die die ISerializable-Schnittstelle implementieren, bei der Serialisierung oder Deserialisierung von JSON vollständig unterstützt.In general, types that implement the ISerializable interface are fully supported when serializing/deserializing JSON. Jedoch sind manche dieser Typen (einschließlich einiger .NET Framework-Typen) so implementiert, dass die JSON-spezifischen Serialisierungseigenheiten dazu führen, dass diese Typen nicht korrekt deserialisiert werden:However, some of these types (including some .NET Framework types) are implemented in such a way that the JSON-specific serialization aspects cause them to not deserialize correctly:

  • Mit ISerializable ist der Typ einzelner Datenmember nicht im Voraus bekannt.With ISerializable, the type of individual data members is never known in advance. Dies führt zu einer polymorphen Situation ähnlich der Deserialisierung von Typen in ein Objekt.This leads to a polymorphic situation similar to deserializing types into an object. Wie bereits erwähnt, führt dies in JSON möglicherweise zum Verlust der Typinformationen.As mentioned before, this may lead to loss of type information in JSON. Ein Typ z. B., der eine enum in seiner ISerializable-Implementierung serialisiert und versucht, den erhaltenen Wert direkt wieder zurück in eine enum zu deserialisieren, wird ohne die korrekten Umwandlungen fehlschlagen, weil eine enum in JSON als Zahl serialisiert wird und JSON-Zahlen in die integrierten numerischen .NET-Typen (Int32, Decimal oder Double) deserialisiert werden.For example, a type that serializes an enum in its ISerializable implementation and attempts to deserialize back directly into an enum (without proper casts) fails, because an enum is serialized using numbers in JSON and JSON numbers deserialize into built-in .NET numeric types (Int32, Decimal or Double). Deshalb geht die Tatsache, dass die verwendete Zahl ein enum-Wert war, verloren.So the fact that the number used to be an enum value is lost.

  • Ein ISerializable-Typ, der in seinem Deserialisierungskonstruktor von einer bestimmten Reihenfolge der Deserialisierung abhängt, wird bei der Deserialisierung mancher JSON-Daten möglicherweise ebenfalls fehlschlagen, weil die meisten JSON-Serialisierungsprogramme keine bestimmte Reihenfolge gewährleisten.An ISerializable type that depends on a particular order of deserialization in its deserialization constructor may also fail to deserialize some JSON data, because most JSON serializers do not guarantee any specific order.

FactorytypenFactory Types

Während die IObjectReference-Schnittstelle allgemein in JSON unterstützt wird, werden Typen, die die Funktion "Factorytyp" benötigen (die Rückgabe eines anderen Typs von GetRealObject(StreamingContext) als den Typ, der die Schnittstelle implementiert) nicht unterstützt.While the IObjectReference interface is supported in JSON in general, any types that require the "factory type" feature (returning an instance of a different type from GetRealObject(StreamingContext) than the type that implements the interface) are not supported.

DateTime-ÜbertragungsformatDateTime Wire Format

DateTime-Werte werden als JSON-Zeichenfolgen im Format "/Date(700000+0500)/" dargestellt, wobei die erste Zahl (700000 in dem angeführten Beispiel) die Anzahl der seit Mitternacht des 1. Januar 1970 in der GMT-Zeitzone verstrichenen Millisekunden (ohne Berücksichtigung der Sommerzeit) angibt.DateTime values appear as JSON strings in the form of "/Date(700000+0500)/", where the first number (700000 in the example provided) is the number of milliseconds in the GMT time zone, regular (non-daylight savings) time since midnight, January 1, 1970. Die Zahl kann negativ sein und gibt dann einen früheren Zeitpunkt an.The number may be negative to represent earlier times. Der im Beispiel als "+0500" angegebene Teil ist optional und legt fest, dass die Zeitangabe als Local zu verstehen ist, also bei der Deserialisierung in eine lokale Zeitzone konvertiert werden muss.The part that consists of "+0500" in the example is optional and indicates that the time is of the Local kind - that is, should be converted to the local time zone on deserialization. Fehlt dieser Teil, wird die Zeitangabe als Utc deserialisiert.If it is absent, the time is deserialized as Utc. Die tatsächliche Zahl ("0500" in diesem Beispiel) und ihr Vorzeichen (+ oder -) werden ignoriert.The actual number ("0500" in this example) and its sign (+ or -) are ignored.

Bei der Serialisierung werden DateTime-, Local- und Unspecified-Zeitangaben mit einem Offset und Utc-Zeitangaben ohne Offset geschrieben.When serializing DateTime, Local and Unspecified times are written with an offset, and Utc is written without.

Im JavaScript-Code eines ASP.NET AJAX-Clients werden solche Zeichenfolgen automatisch in DateTime-Instanzen für JavaScript konvertiert.The ASP.NET AJAX client JavaScript code automatically converts such strings into JavaScript DateTime instances. Andere Zeichenfolgen ähnlicher Form, die aber nicht vom .NET-Typ DateTime sind, werden ebenfalls konvertiert.If there are other strings that have a similar form that are not of type DateTime in .NET, they are converted as well.

Die Konvertierung nur erfolgt, wenn das Zeichen "/" mit Escapezeichen versehen werden (also die JSON sieht wie folgt "\/Date(700000+0500)\/"), und für diese Ursache-WCF-JSON-Encoder (aktiviert, indem die WebHttpBinding) immer mit Escapezeichen das Zeichen "/".The conversion only takes place if the "/" characters are escaped (that is, the JSON looks like "\/Date(700000+0500)\/"), and for this reason WCF's JSON encoder (enabled by the WebHttpBinding) always escapes the "/" character.

XML in JSON-ZeichenfolgenXML in JSON Strings

XmlElementXmlElement

Der Typ XmlElement wird ohne Einbindung serialisiert wie er ist.XmlElement is serialized as is, with no wrapping. Z. B. der Datenmember "X" vom Typ XmlElement enthält <Abc / > wird wie folgt dargestellt.For example, data member "x" of type XmlElement that contains <abc/> is as represented as follows.

{"x":"<abc/>"}  

XmlNode-ArraysArrays of XmlNode

Array-Objekte des Typs XmlNode werden in ein Element namens ArrayOfXmlNode im Standardnamespace des Datenvertrags für den Typ eingebunden.Array objects of type XmlNode are wrapped in an element called ArrayOfXmlNode in the standard data contract namespace for the type. Ist "x" ein Array, das den Attributknoten "N" im Namespace "ns" enthält, der seinerseits "value" und den leeren Elementknoten "M" enthält, dann ergibt sich folgende Darstellung.If "x" is an array that contains attribute node "N" in namespace "ns" that contains "value" and an empty element node "M", the representation is as follows.

{"x":"<ArrayOfXmlNode xmlns=\"http://schemas.datacontract.org/2004/07/System.Xml\" a:N=\"value\" xmlns:a=\"ns\"><M/></ArrayOfXmlNode>"}  

Attribute in einem leeren Namespace werden am Anfang von XmlNode-Arrays (vor anderen Elementen) nicht unterstützt.Attributes in the empty namespace at the beginning of XmlNode arrays (before other elements) are unsupported.

IXmlSerializable-Typen, einschließlich XElement- und DataSet-TypenIXmlSerializable Types including XElement and DataSet

ISerializable-Typen teilen sich in "Inhaltstypen", "DataSet-Typen" und "Elementtypen".ISerializable types subdivide into "content types", "DataSet types" and "element types". Definitionen dieser Typen finden Sie unter XML- und ADO.NET-Typen in Datenverträgen.For definitions of these types, see XML and ADO.NET Types in Data Contracts.

"Inhalts-" und "DataSet-Typen" werden ähnlich den Array-Objekten von XmlNodeserialisiert, die im vorherigen Abschnitt erläutert wurden."Content" and "DataSet" types are serialized similar to Array objects of XmlNode discussed in the previous section. Sie werden in ein Element eingebunden, dessen Name und Namespace dem Datenvertragsnamen und dem Namespace des jeweiligen Typs entsprechen.They are wrapped in an element whose name and namespace corresponds to the data contract name and namespace of the type in question.

"Elementtypen", wie das XElement, werden serialisiert wie sie sind, ähnlich wie das bereits in diesem Thema erläuterte XmlElement."Element" types such as XElement are serialized as is, similar to XmlElement previously discussed in this topic.

PolymorphismusPolymorphism

Bewahren von TypinformationenPreserving Type Information

Wie schon vorher festgestellt, wird Polymorphie in JSON mit einigen Einschränkungen unterstützt.As stated earlier, polymorphism is supported in JSON with some limitations. JavaScript ist eine schwach typisierte Sprache, und Typidentität stellt normalerweise kein Problem dar.JavaScript is a weakly-typed language and type identity is normally not an issue. Wird jedoch JSON verwendet, um zwischen einem stark typisierten System (.NET) und einem schwach typisierten System (JavaScript) zu kommunizieren, ist es sinnvoll, die Typidentität zu bewahren.However, when using JSON to communicate between a strongly-typed system (.NET) and a weakly-typed system (JavaScript), it is useful to preserve type identity. Die Typen mit den Datenvertragsnamen "Square" und "Circle" sind beispielsweise von einem Typ mit dem Datenvertragsnamen "Shape" abgeleitet.For example, types with data contract names "Square" and "Circle" derive from a type with a data contract name of "Shape". Wenn "Circle" von .NET zu JavaScript gesendet und später wieder an eine .NET-Methode übergeben wird, die "Shape" erwartet, ist es für .NET sinnvoll zu wissen, dass das fragliche Objekt ursprünglich ein "Circle" war. Andernfalls gehen eventuell alle für den abgeleiteten Typ spezifischen Informationen (z. B. der Datenmember "radius" von "Circle") verloren.If "Circle" is sent from .NET to JavaScript and is later returned to a .NET method that expects "Shape", it is useful for the .NET side to know that the object in question was originally a "Circle" - otherwise any information specific to the derived type (for example, "radius" data member on "Circle") may be lost.

Um bei der Serialisierung komplexer Typen zu JSON die Typidentität zu bewahren, kann ein "Typhinweis" hinzugefügt werden, den das Deserialisierungsprogramm erkennen und auf den es entsprechend reagieren kann.To preserve type identity, when serializing complex types to JSON a "type hint" can be added, and the deserializer recognizes the hint and acts appropriately. Der "Typhinweis" ist ein JSON-Schlüssel-Wert-Paar mit dem Schlüsselnamen "__type" (zwei Unterstriche gefolgt von "type").The "type hint" is a JSON key/value pair with the key name of "__type" (two underscores followed by the word "type"). Der Wert ist eine JSON-Zeichenfolge der Form "DataContractName:DataContractNamespace" (alles vor dem ersten Doppelpunkt bildet den Namen).The value is a JSON string of the form "DataContractName:DataContractNamespace" (anything up to the first colon is the name). Bei dem schon früher verwendeten Beispiel kann "Circle" wie folgt serialisiert werden.Using the earlier example, "Circle" can be serialized as follows.

{"__type":"Circle:http://example.com/myNamespace","x":50,"y":70,"radius":10}  

Der Typhinweis ist dem von der standardmäßigen XML-Schemainstanz definierten und bei der Serialisierung oder Deserialisierung verwendeten xsi:type-Attribut sehr ähnlich.The type hint is very similar to the xsi:type attribute defined by the XML Schema Instance standard and used when serializing/deserializing XML.

Datenmember mit dem Namen "__type" sind wegen eines möglichen Konflikts mit dem Typhinweis nicht zulässig.Data members called "__type" are forbidden due to potential conflict with the type hint.

Reduzieren der Größe von TyphinweisenReducing the Size of Type Hints

Zum Verringern der Größe der JSON-Nachrichten, das Standardpräfix für ein Vertrag-Namespace (http://schemas.datacontract.org/2004/07/) wird durch das "#"-Zeichen ersetzt.To reduce the size of JSON messages, the default data contract namespace prefix (http://schemas.datacontract.org/2004/07/) is replaced with the "#" character. (Um diese Ersetzung umkehrbare gestalten, eine Regel für die Escapezeichen verwendet wird: Wenn der Namespace beginnt mit der "#" oder "\" Zeichen, d. h. sie werden mit einem zusätzlichen angefügt "\" Zeichen).(To make this replacement reversible, an escaping rule is used: if the namespace starts with the "#" or "\" characters, they are appended with an extra "\" character). Wenn daher "Circle" ein Typ im .NET-Namespace "MyApp.Shapes" ist, dessen Standardwert datenvertragsnamespace lautet http://schemas.datacontract.org/2004/07/MyApp.Thus, if "Circle" is a type in the .NET namespace "MyApp.Shapes", its default data contract namespace is http://schemas.datacontract.org/2004/07/MyApp. Shapes und die JSON-Darstellung lautet wie folgt.Shapes and the JSON representation is as follows.

{"__type":"Circle:#MyApp.Shapes","x":50,"y":70,"radius":10}  

Sowohl der gekürzte (#MyApp.Shapes) und die vollständige (http://schemas.datacontract.org/2004/07/MyApp.Shapes) Namen bei der Deserialisierung verstanden.Both the truncated (#MyApp.Shapes) and the full (http://schemas.datacontract.org/2004/07/MyApp.Shapes) names is understood on deserialization.

Position des Typhinweises in JSON-ObjektenType Hint Position in JSON Objects

Beachten Sie, dass in der JSON-Darstellung der Typhinweis das erste Element sein muss.Note that the type hint must appear first in the JSON representation. Dies ist der einzige Fall, wo die Reihenfolge von Schlüssel/Wert-Paaren bei der JSON-Verarbeitung wichtig ist.This is the only case where order of key/value pairs is important in JSON processing. Folgendes ist beispielsweise keine gültige Angabe des Typhinweises.For example, the following is not a valid way to specify the type hint.

{"x":50,"y":70,"radius":10,"__type":"Circle:#MyApp.Shapes"}  

Sowohl die DataContractJsonSerializer verwendet WCF und ASP.NET AJAX-Clientseiten der typhinweis zuerst.Both the DataContractJsonSerializer used by WCF and ASP.NET AJAX client pages always emit the type hint first.

Typhinweise gelten nur für komplexe TypenType Hints Apply Only to Complex Types

Es gibt keine Möglichkeit, einen Typhinweis für nicht-komplexe Typen auszugeben.There is no way to emit a type hint for non-complex types. Hat z. B. ein Vorgang einen Object-Rückgabetyp, gibt aber einen Circle-Typ zurück, entspricht die JSON-Darstellung wahrscheinlich der vorher gezeigten, und die Typinformationen werden beibehalten.For example, if an operation has an Object return type but returns a Circle, the JSON representation can be as shown earlier and the type information is preserved. Wird jedoch ein URI-Typ zurückgegeben, ist die JSON-Darstellung eine Zeichenfolge, und die Tatsache, dass diese Zeichenfolge einen URI-Typ darstellt, geht verloren.However, if Uri is returned, the JSON representation is a string and the fact that the string used to represent a Uri is lost. Dies gilt nicht nur für primitive Typen, sondern auch für Auflistungen und Arrays.This applies not only to primitive types but also to collections and arrays.

Wann Typhinweise ausgegeben werdenWhen Are Type Hints Emitted

Typhinweise können die Nachrichtengröße beträchtlich erhöhen. Dieses Problem kann durch die Verwendung kürzerer Datenvertragsnamespaces (wenn möglich) vermieden werden.Type hints may increase message size significantly (one way to mitigate this is to use shorter data contract namespaces if possible). Deshalb bestimmen die folgenden Regeln, ob Typhinweise ausgegeben werden:Therefore, the following rules govern whether type hints are emitted:

  • Bei Verwendung von ASP.NET AJAX werden Typhinweise nach Möglichkeit ausgegeben, auch wenn keine Zuweisung von Basistypen zu abgeleiteten Typen besteht. Dies gilt auch, wenn beispielsweise ein Circle einem Circle zugewiesen ist.When using ASP.NET AJAX, type hints are always emitted whenever possible, even if there is no base/derived assignment - for example, even if a Circle is assigned to a Circle. (Dies ist erforderlich, um den Aufruf aus der schwach typisierten JSON-Umgebung in die stark typisierte .NET-Umgebung vollständig zu unterstützen und den versehentlichen Verlust von Informationen zu vermeiden.)(This is required to fully enable the process of calling from the weakly-typed JSON environment into the strongly-typed .NET environment with no surprising loss of information.)

  • Bei Verwendung von AJAX-Diensten ohne ASP.NET-Integration werden Typhinweise nur dann ausgegeben, wenn es eine Zuweisung von Basistypen zu abgeleiteten Typen gibt – also wenn Circle einem Shape-Typ oder einem Object zugewiesen ist, nicht aber, wenn Circle einem Circle zugewiesen ist.When using AJAX services with no ASP.NET integration, type hints are only emitted when there is a base/derived assignment - that is, emitted when Circle is assigned to Shape or Object but not when assigned to Circle. Dies stellt die zur korrekten Implementierung eines JavaScript-Clients notwendigen Mindestinformationen bereit und verbessert so die Leistung, schützt jedoch nicht vor dem Verlust von Typinformationen in nicht ordnungsgemäß implementierten Clients.This provides the minimum information required to correctly implement a JavaScript client, thus improving performance, but does not protect against type information loss in incorrectly-designed clients. Vermeiden Sie Zuweisungen von Basistypen zu abgeleiteten Typen auf dem Server, damit Sie diese Probleme nicht beim Client behandeln müssen.Avoid base/derived assignments altogether on the server if you want to avoid dealing with this issue on the client.

  • Wenn Sie den DataContractSerializer-Typ verwenden, ermöglicht Ihnen der alwaysEmitTypeInformation-Parameter des Konstruktors, zwischen den beiden genannten Möglichkeiten zu wählen, wobei der Standard auf "false" festgelegt ist (Typhinweise nur wenn erforderlich ausgeben).When using the DataContractSerializer type, the alwaysEmitTypeInformation constructor parameter allows you to choose between the preceding two modes, with the default being "false" (only emit type hints when required).

Doppelte DatenelementnamenDuplicate Data Member Names

Im JSON-Objekt sind Informationen des abgeleiteten Typs zusammen mit denen des Basistyps in beliebiger Reihenfolge vorhanden.Derived type information is present in the same JSON object together with base type information, and can occur in any order. Beispielsweise Shape kann wie folgt dargestellt werden.For example, Shape may be represented as follows.

{"__type":"Shape:#MyApp.Shapes","x":50,"y":70}  

Circle wird dagegen möglicherweise wie folgt dargestellt wird.Whereas Circle may be represented as follows.

{"__type":"Circle:#MyApp.Shapes","x":50, "radius":10,"y":70}  

Wenn die Basis Shape Typ enthalten auch einen Datenmember namens "radius", dies führt zu einem Konflikt auf beide Serialisierung (da es sich um eine JSON-Objekten wiederholte Schlüsselnamen enthalten dürfen) und die Deserialisierung (weil es unklar ist, gibt an, ob sich "Radius" auf verweistShape.radius oder Circle.radius).If the base Shape type also contained a data member called "radius", this leads to a collision on both serialization (because JSON objects cannot have repeating key names) and deserialization (because it is unclear whether "radius" refers to Shape.radius or Circle.radius). Daher ist das Konzept des "Verbergens von Eigenschaften" (Datenmember mit gleichen Namen in der Basisklassen und in abgeleiteten Klassen), das in Datenvertragsklassen generell nicht empfohlen wird, im Fall von JSON sogar unzulässig.Therefore, while the concept of "property hiding" (data members of the same name on based and derived classes) is generally not recommended in data contract classes, it is actually forbidden in the case of JSON.

Polymorphie und IXmlSerializable-TypenPolymorphism and IXmlSerializable Types

IXmlSerializable-Typen können polymorph einander zugewiesen werden, solange die Anforderungen für bekannte Typen entsprechend den üblichen Datenvertragsregeln eingehalten werden.IXmlSerializable types may be polymorphically assigned to each other as usual as long as Known Types requirements are met, according to usual data contract rules. Die Serialisierung eines IXmlSerializable-Typs statt eines Object-Typs führt zu einem Verlust von Typinformationen, da das Ergebnis eine JSON-Zeichenfolge ist.However, serializing an IXmlSerializable type in place of Object results in loss of type information as the result is a JSON string.

Polymorphie und bestimmte SchnittstellentypenPolymorphism and Certain Interface Types

Es ist nicht zulässig, einen Auflistungstyp oder einen Typ, der IXmlSerializable implementiert, zu serialisieren, wenn ein Nicht-Auflistungstyp erwartet wird, der nicht IXmlSerializable ist (ausgenommen Object).It is forbidden to serialize a collection type or a type that implements IXmlSerializable where a non-collection type that is not IXmlSerializable (except for Object) is expected. Angenommen, eine benutzerdefinierte Schnittstelle namens IMyInterface und einen Typ MyType implementieren sowohl IEnumerable<T> des Typs int und IMyInterface.For example, a custom interface called IMyInterface and a type MyType that implement both IEnumerable<T> of type int and IMyInterface. Es ist nicht zulässig, zurückzugebenden MyType aus einem Vorgang, dessen Rückgabetyp IMyInterface.It is forbidden to return MyType from an operation whose return type is IMyInterface. Grund hierfür ist, MyType als JSON-Array serialisiert werden muss und einen typhinweis erfordert, und wie bereits erwähnt, Sie können einen typhinweis mit Arrays, nur bei komplexen Typen enthalten.This is because MyType must be serialized as a JSON array and requires a type hint, and as stated before you cannot include a type hint with arrays, only with complex types.

Bekannte Typen und KonfigurationKnown Types and Configuration

Der gesamte vom DataContractSerializer verwendete Mechanismus bekannter Typen wird auf gleiche Weise auch vom DataContractJsonSerializer unterstützt.All of the Known Type mechanisms used by the DataContractSerializer are also supported in the same way by the DataContractJsonSerializer. Beide Serialisierungsprogramme lesen Sie das gleiche Konfigurationselement <"DataContractSerializer" > in <system.runtime.serialization >, um die bekannte Typen hinzugefügt ermitteln mithilfe einer Konfigurationsdatei.Both serializers read the same configuration element, <dataContractSerializer> in <system.runtime.serialization>, to discover known types added through a configuration file.

Objekten zugewiesene AuflistungenCollections Assigned to Object

Objekten zugewiesene Auflistungen werden so serialisiert als handele es sich um Auflistungen, die IEnumerable<T> implementieren: als JSON-Array, bei dem jeder Eintrag einen Typhinweis besitzt, als wäre er ein komplexer Typ.Collections assigned to Object are serialized as if they are collections that implement IEnumerable<T>: a JSON array with each entry that has a type hint if it is a complex type. Z. B. eine List<T> des Typs Shape zugewiesene Object sieht wie folgt.For example, a List<T> of type Shape assigned to Object looks like the following.

[{"__type":"Shape:#MyApp.Shapes","x":50,"y":70},  
{"__type":"Shape:#MyApp.Shapes","x":58,"y":73},  
{"__type":"Shape:#MyApp.Shapes","x":41,"y":32}]  

Wenn es wieder in ein Object deserialisiert wird:When deserialized back into Object:

  • Shape muss in der Liste bekannter Typen enthalten sein.Shape must be in the Known Types list. Mit List<T> des Typs Shape in bekannten Typen hat keine Wirkung.Having List<T> of type Shape in known types has no effect. Beachten Sie, dass Sie nicht hinzuzufügende Shape bekannten Typen bei der Serialisierung in diesem Fall – dies erfolgt automatisch.Note that you do not have to add Shape to known types on serialization in this case - this is done automatically.

  • Die Auflistung wird deserialisiert, als ein Array des Typs Object enthält Shape Instanzen.The collection is deserialized as an Array of type Object that contains Shape instances.

Abgeleitete Auflistungen, die Basisauflistungen zugewiesen sindDerived Collections Assigned to Base Collections

Wenn eine abgeleitete Auflistung einer Basisauflistung zugewiesen ist, wird die Auflistung normalerweise so serialisiert, als wäre sie eine Auflistung des Basistyps.When a derived collection is assigned to a base collection, the collection is usually serialized as if it was a collection of the base type. Kann jedoch der Elementtyp der abgeleiteten Auflistung nicht dem Elementtyp der Basisauflistung zugewiesen werden, wird eine Ausnahme ausgelöst.However, if the item type of the derived collection cannot be assigned to the item type of the base collection, an exception is thrown.

Typhinweise und WörterbücherType Hints and Dictionaries

Wenn ein Wörterbuch einem Object zugewiesen ist, wird jeder Schlüssel- und Werteintrag des Wörterbuchs so behandelt, als wäre er Object zugewiesen, und erhält einen Typhinweis.When a dictionary is assigned to an Object, each Key and Value entry in the dictionary is treated as if it was assigned to Object and gets a type hint.

Bei der Serialisierung von Wörterbuchtypen, wird das JSON-Objekt, das die Member "Key" und "Value" enthält, von der alwaysEmitTypeInformation-Einstellung nicht betroffen und erhält nur dann einen Typhinweis, wenn die oben genannten Auflistungsregeln dies erfordern.When serializing dictionary types, the JSON object that contains the "Key" and "Value" members is unaffected by the alwaysEmitTypeInformation setting and only contains a type hint when the preceding collection rules require it.

Gültige JSON-SchlüsselnamenValid JSON Key Names

Das Serialisierungsprogramm codiert Schlüsselnamen in XML, die keine gültigen XML-Namen sind.The serializer XML-encodes key names that are not valid XML names. Beispielsweise ein Datenmember mit dem Namen "123" müsste eine codierte Name wie z. B. "x0031__x0032__x0033\" "123" ist ein ungültiges XML-Elementnamen (beginnt mit einer Ziffer).For example, a data member with the name of "123" would have an encoded name such as "x0031__x0032__x0033\" because "123" is an invalid XML element name (starts with a digit). Eine ähnliche Situation tritt möglicherweise bei einigen internationalen Zeichensätzen auf, deren Verwendung ungültige XML-Namen ergibt.A similar situation may arise with some international character sets not valid in XML names. Eine Erläuterung dieser Effekt auf JSON-Verarbeitung von XML, finden Sie unter Zuordnung zwischen JSON und XML-.For an explanation of this effect of XML on JSON processing, see Mapping Between JSON and XML.

Siehe auchSee Also

Unterstützung für JSON und andere DatenübertragungsformateSupport for JSON and Other Data Transfer Formats