Skip to content

Commit 0abce52

Browse files
committed
manipulate property order
1 parent 6d63bec commit 0abce52

File tree

5 files changed

+53
-4
lines changed

5 files changed

+53
-4
lines changed

docs/core/whats-new/dotnet-9/libraries.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ The <xref:System.Json.JsonObject> type now exposes ordered dictionary&ndash;like
544544

545545
:::code language="csharp" source="../snippets/dotnet-9/csharp/Serialization.cs" id="PropertyOrder":::
546546

547+
For more information, see [Manipulate property order](../../../standard/serialization/system-text-json/use-dom.md#manipulate-property-order).
548+
547549
### Customize enum member names
548550

549551
The new <xref:System.Text.Json.Serialization.JsonStringEnumMemberNameAttribute?displayProperty=nameWithType> attribute can be used to customize the names of individual enum members for types that are serialized as strings:

docs/framework/wcf/samples/weakly-typed-json-serialization-sample.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class PersonalInfo
5353

5454
This can be cumbersome, especially if the client has to handle more than one type of JSON object.
5555

56-
The `JsonObject` type provided by this sample introduces a weakly-typed representation of the deserialized JSON object. `JsonObject` relies on the natural mapping between JSON objects and .NET Framework dictionaries, and the mapping between JSON arrays and .NET Framework arrays. The following code shows the `JsonObject` type.
56+
The `JsonObject` type provided by this sample introduces a weakly typed representation of the deserialized JSON object. `JsonObject` relies on the natural mapping between JSON objects and .NET Framework dictionaries, and the mapping between JSON arrays and .NET Framework arrays. The following code shows the `JsonObject` type.
5757

5858
```csharp
5959
// Instantiation of JsonObject json omitted

docs/standard/serialization/system-text-json/custom-contracts.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ There are two ways to plug into customization. Both involve obtaining a resolver
5050
The <xref:System.Text.Json.Serialization.Metadata.JsonTypeInfo.Kind?displayProperty=nameWithType> property indicates how the converter serializes a given type&mdash;for example, as an object or as an array, and whether its properties are serialized. You can query this property to determine which aspects of a type's JSON contract you can configure. There are four different kinds:
5151

5252
| `JsonTypeInfo.Kind` | Description |
53-
| - | - |
53+
|---------------------|-------------|
5454
| <xref:System.Text.Json.Serialization.Metadata.JsonTypeInfoKind.Object?displayProperty=nameWithType> | The converter will serialize the type into a JSON object and uses its properties. **This kind is used for most class and struct types and allows for the most flexibility.** |
5555
| <xref:System.Text.Json.Serialization.Metadata.JsonTypeInfoKind.Enumerable?displayProperty=nameWithType> | The converter will serialize the type into a JSON array. This kind is used for types like `List<T>` and array. |
5656
| <xref:System.Text.Json.Serialization.Metadata.JsonTypeInfoKind.Dictionary?displayProperty=nameWithType> | The converter will serialize the type into a JSON object. This kind is used for types like `Dictionary<K, V>`. |
@@ -63,7 +63,7 @@ A modifier is an `Action<JsonTypeInfo>` or a method with a <xref:System.Text.Jso
6363
The following table shows the modifications you can make and how to achieve them.
6464

6565
| Modification | Applicable `JsonTypeInfo.Kind` | How to achieve it | Example |
66-
| - | - | - | - |
66+
|--------------|--------------------------------|-------------------|---------|
6767
| Customize a property's value | `JsonTypeInfoKind.Object` | Modify the <xref:System.Text.Json.Serialization.Metadata.JsonPropertyInfo.Get?displayProperty=nameWithType> delegate (for serialization) or <xref:System.Text.Json.Serialization.Metadata.JsonPropertyInfo.Set?displayProperty=nameWithType> delegate (for deserialization) for the property. | [Increment a property's value](#example-increment-a-propertys-value) |
6868
| Add or remove properties | `JsonTypeInfoKind.Object` | Add or remove items from the <xref:System.Text.Json.Serialization.Metadata.JsonTypeInfo.Properties?displayProperty=nameWithType> list. | [Serialize private fields](#example-serialize-private-fields) |
6969
| Conditionally serialize a property | `JsonTypeInfoKind.Object` | Modify the <xref:System.Text.Json.Serialization.Metadata.JsonPropertyInfo.ShouldSerialize?displayProperty=nameWithType> predicate for the property. | [Ignore properties with a specific type](#example-ignore-properties-with-a-specific-type) |
@@ -114,7 +114,7 @@ Besides customizing a contract, there are other ways to influence serialization
114114
- By modifying <xref:System.Text.Json.JsonSerializerOptions>, for example, to set a naming policy or serialize enumeration values as strings instead of numbers.
115115
- By writing a custom converter that does the actual work of writing the JSON and, during deserialization, constructing an object.
116116

117-
Contract customization is an improvement over these pre-existing customizations because you might not have access to the type to add attributes, and writing a custom converter is complex and hurts performance.
117+
Contract customization is an improvement over these pre-existing customizations because you might not have access to the type to add attributes. In addition, writing a custom converter is complex and hurts performance.
118118

119119
## See also
120120

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.Linq;
2+
using System.Text.Json;
3+
using System.Text.Json.Nodes;
4+
using System.Text.Json.Schema;
5+
6+
namespace JsonNodePropertyOrder;
7+
8+
public class Program
9+
{
10+
public static void Main()
11+
{
12+
// <Snippet1>
13+
var schema = (JsonObject)JsonSerializerOptions.Default.GetJsonSchemaAsNode(typeof(MyPoco));
14+
15+
JsonNode? idValue;
16+
switch (schema.IndexOf("$id"))
17+
{
18+
// $id property missing.
19+
case < 0:
20+
idValue = (JsonNode)"https://example.com/schema";
21+
schema.Insert(0, "$id", idValue);
22+
break;
23+
24+
// $id property already at the start of the object.
25+
case 0:
26+
break;
27+
28+
// $id exists but not at the start of the object.
29+
case int index:
30+
idValue = schema[index];
31+
schema.RemoveAt(index);
32+
schema.Insert(0, "$id", idValue);
33+
break;
34+
}
35+
// </Snippet1>
36+
}
37+
}
38+
39+
class MyPoco { }

docs/standard/serialization/system-text-json/use-dom.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ The following example illustrates the result of using methods that take a `JsonS
8585

8686
If you need features of `JsonSerializerOptions` other than custom converters, use `JsonSerializer` with strongly typed targets (such as the `Person` class in this example) rather than `JsonNode`.
8787

88+
### Manipulate property order
89+
90+
<xref:System.Text.Json.Nodes.JsonObject> is one of the elements in the payload of a <xref:System.Text.Json.Nodes.JsonNode>, and it represents a mutable JSON object. Even though the type is modelled as an `IDictionary<string, JsonNode>`, where each entry is a property of the object, it encapsulate an implicit property order. However, APIs such as <xref:System.Text.Json.Nodes.JsonObject.Insert(System.Int32,System.String,System.Text.Json.Nodes.JsonNode)> and <xref:System.Text.Json.Nodes.JsonObject.RemoveAt(System.Int32)> effectively model the type as an ordered dictionary by letting you insert and remove items at a specific index. These APIs allow modifications to object instances that can directly influence property order.
91+
92+
The following code shows an example of adding or moving a specific property to the start of the object.
93+
94+
:::code language="csharp" source="snippets/use-dom-utf8jsonreader-utf8jsonwriter/csharp/JsonNodePropertyOrder.cs" id="1":::
95+
8896
### Compare JsonNodes
8997

9098
To compare two `JsonNode` objects for equality, including their descendant elements, use the <xref:System.Text.Json.Nodes.JsonNode.DeepEquals(System.Text.Json.Nodes.JsonNode,System.Text.Json.Nodes.JsonNode)?displayProperty=nameWithType> method.

0 commit comments

Comments
 (0)