System.Text.Json replaced the package everyone installed

3.0 brought a JSON serialiser into the framework, and it is stricter than the third-party one it replaces in ways that break existing code quietly.

// the default is now camelCase on output and case-SENSITIVE on input
var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var order = JsonSerializer.Deserialize<Order>(body, options);

Case-sensitive deserialisation is the change that catches everyone: a payload with Order_Id silently produces a default value rather than throwing, so the object is constructed and empty. It is faster and allocates less than the package it replaces, which is the reason it exists. Anything relying on the old serialiser’s permissiveness — comments in JSON, trailing commas, non-string dictionary keys — needs either an option set or the old package kept.