How it works
A naming policy changes the JSON property names emitted or recognized by a serializer contract. CamelCase turns DisplayName into displayName while leaving the C# property name readable in its usual style. Reuse a configured options instance for a consistent format instead of building slightly different contracts in each method. Naming policies and case-insensitive reading are separate settings: one chooses names, while the other determines how broadly a reader matches them.
External formats should state the chosen convention explicitly. Do not rename persisted fields casually; an internal refactor should not unintentionally rewrite the document contract that another tool expects.
Serialize without the options and compare the keys. Then deserialize a camel-case document using the same options and verify that both directions follow the intended contract.
A working example
using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
Console.WriteLine(JsonSerializer.Serialize(new Profile("Ada", 4), options));
record Profile(string DisplayName, int VisitCount);
Expected output
{"displayName":"Ada","visitCount":4}External naming is a contract separate from internal C# identifiers.