Magnus Mårtensson
Microsoft Regional Director, Azure MVP, CEO Loftysoft
Avirag Jain
Director & CTO R Systems
Mahesh Chand
Founder C# Corner, CEO Mindcracker
Chris Gali
CEO & Co-Founder Graphite
Subinder Khurana
Chief Architect StoryProcess, Founder NASSCOM DeepTech Club
Bryan Rishforth
Investor, Chairman Graphite
Bryn Everson
Director Biz Dev Graphite
Raj Tiwari
Digital Transformation Leader, Futurist and Visionary
Joseph Guadagno
Microsoft MVP, Lead Quicken Loans
Nikita Sachdev
Entrepreneur, Blockchain Enthusiast & Advisor, Social Media Influencer
Doug Wagner
COO & Founder Adapt Technical Group
Ritesh Modi
Architect, Senior Evangelist, Cloud Architect
Crystal Wenrick
Director Communications Mindcracker
Allen O’Neill
Microsoft MVP, Consulting Engineer/Architect
Praveen Kumar
CEO MCN Solutions
Chris Love
Founder Love2Dev, Microsoft MVP, Author
Sanjay Vyas
Microsoft Regional Director, Microsoft MVP, Founder & CEO SkillLabs Technologies
Veena Sarda
Deep Learning Consultant, Author
Sekhar Srinivasan
C# Corner MVP, Microsoft Certified Trainer, Pluralsight Author
Lalit Bansal
Founder & CEO - EIY SYS
Navdeep Garg
CEO Revinfotech
Prakash Tripathi
Tech Manager/Leader, Microsoft MVP, Blogger
Bhavna Jain
Breakthrough Consultant
Naveen Sharma
Enterprise Architect, Leadership Coach, Author
Vidya Vrat Agarwal
Principal Architect, Microsoft MVP, Author
Sheetal Agarwal
Founder Clownselors, Medical Clown, Trainer
Abhishek Kant
Founder GTM Catalyst
Vishnu Saran
Founder & CEO VoiceQube
Sandeep Soni
Founder & CEO Deccansoft, Microsoft Certified Trainer
Parveen Malik
AVP InfoSec & Vulnerability Management, Information Security Expert
Nitin Pandit
Microsoft MVP, Developer Evangelist, Author
Niloshima Srivastava
C# Corner MVP, Tech Architect, Trainer, Blogger
Bala Chirtsabesan
Senior Software Engineer at Microsoft, Author
Manoj Mittal
Sr. Technical Architect, C# Corner MVP, Author
Chandni Di
Co-Founder Voice of Slum
Vithal Wadje
Technical Lead, Microsoft MVP, Author
Shivam Ahuja
Founder SkillCircle, Business Mentor
Chervine Bhiwoo
Solution Architect, Microsoft MVP, Author
Saurabh Jain
Vice President Paytm, Founder Fun2Do Labs, Author
Vinay Solanki
Head IoT at Lenovo, Founder IoT-NCR
Anshu kumari
Founder Blockchainkids, Inventor, Trainer
Amit Singal
CEO Startup Buddy
Dev Pratap
Co-Founder & CEO Voice of Slum
Amey Vartak
Technology Consultant, Full Stack Developer, C# Corner MVP, Author
Viswanatha Swamy
Principal Software Engineer, C# Corner MVP, Author
Sanket Verma
Research Engineer @ Ballistics (Forensics) and Chair, PyData Delhi
Sourabh Somani
Lead Developer, Microsoft MVP, Author
Abhishek Mishra
Software Architect, C# Corner MVP, Author
Siddharth Vaghasia
Technical Consultant, C# Corner MVP, Blogger
Bassam Alugili
Senior Software Specialist, Database Expert
S Ravi Kumar
Solution Architect, C# Corner MVP, Author
Sundaram Subramanian
Full Stack Developer, C# Corner MVP, Speaker
Deepesh Somani
Solution Architect, Microsoft MVP, Author
Debasis Saha
Technical Project Manager, C# Corner MVP, Blogger, Author
Vipul Jain
Software Architect, C# Corner MVP, Author
Akshay Patel
Technical Architect, Microsoft Certified Trainer, C# Corner MVP, Author
Stephen Simon
RPA Developer, Evangelist, Author
Vivek Sharma
Founder Kingster636, AR/VR Specialist
Jeetendra Gund
Technical Lead, C# Corner MVP, Author
Sujal Beniwal
AI Enthusiast, Student
M Viknaraj
Microsoft MVP, Azure Architect, Author
Prasham Sabadra
Software Architect, C# Corner MVP, Trainer, Author
Aakash Maurya
Senior Developer, C# Corner MVP, Speaker
Ankit Sharma
Senior Software Engineer, C# Corner MVP, Author
Mangesh Gaherwar
Team Lead, C# Corner MVP, Author
Viral Jain
Technical Consultant, C# Corner MVP, Author
Bhasker Das
Solution Architect, Evangelist
Manish Dwivedi
Associate Project Manager
Ck Nitin
Programmer, Author
Rohit Gupta
Technical Trainer, Author
Manish Tewatia
Full-stack Marketer, UX Designer
Bhavya Gaur
Technical Illustrator
Rohit Tomar
SEO/SMO Expert
Web Track
Cloud & Data Track
Dev Track
Registration & Breakfast
Future of Desktop Apps with JS (ElectronJs)
Nitin Pandit
Building Serverless Microservices Using Microsoft Azure
Vithal Wadje
Innovating RPA: A Robot for Every Person
Stephen Simon
Managing Cloud Storage Accounts using Logic Apps
Viknaraj Manogararajah
Data visualization using Python
Sekhar Srinivasan
Going Cross platform with AR Foundation
Vivek Sharma
Keynote
Managing your Azure dependencies in ASP.NET Core apps using VS
Bala Chirtsabesan
Securing Applications on Intelligent Azure
Abhishek Mishra
Getting started with Blazor the Framework of Future
S Ravi Kumar
Lunch
Build Progressive Web Apps using Angular 9
Debasis Saha
Build and deploy to any platform using Azure DevOps
Chervine Bhiwoo
Deep Dive in Azure Service Bus
Akshay Patel
Build a Native Mobile Application using React Native and JavaScript
Joseph Guadagno
Making sense of Web Job, Web Job SDK and Functions in Azure
Prakash Tripathi
CloudFront Distribution in AWS
Viral Jain
Tea Break
Introduction to PowerBI
Aakash Maurya
Build Advanced SPFx solutions with React and Graph API
Siddharth Vaghasia
Build Business Intelligence Analyst (BIA) Skills
Sundaram Subramanian
Deep dive of Power Platform – AI BUILDER
Prasham Sabadra
Panel 1
What's new in SharePoint development
Vipul Jain
Build a SSO (Single Sign On) based Native JavaScript application with Microsoft Identity within 10 minutes
Manoj Mittal
Panel 2
Applications and working of AI
Veena Sarda
Deploying serverless API's with .Net core 3.0 on AWS & Azure
Amey Vartak
Panel 3
Blockchain with .NET Core (Ark)
Anshu Kumari
Closing Note & Prize Distribution
Dev Track
Cloud Track
Architecture Track
Emerging Tech Track
Registration & Breakfast
Creating Full-Stack Web Apps Using Server-Side Blazor
Ankit Sharma
Real time face recognition with MS Cognitive Services
Niloshima Srivastava
Building Scalable APIs with GraphQL
Jeetendra Gund
Future of development with AI and Blockchain
Navdeep Garg
Debugging Tips and Tricks with Visual Studio 2019
Joseph Guadagno
Azure Containers
Abhishek Kant
Enterprise Architecture
Naveen Sharma
Bot Framework - learn it fast and look like a boss!
Allen O’Neill
Keynote
.Net Core & C# 8 Performance
David McCarter
Working with Azure kubernetes services
Ritesh Modi
Becoming an Architect
Vidyavrat Agarwal
Why Techies Need to Learn Product Management
Saurabh Jain
Lunch
Build a rules engine in .Net Core
Sanjay Vyas
Building CI and CD Pipeline using Azure DevOps
Sandeep Soni
Entity Framework Core - Tips and Tricks, Performance Optimization, and Tuning
Bassam Alugili
Hacking your way into Data Science
Sanket Verma
Speed up your .Net Core Website
Sourabh Somani
Azure
Magnus Mårtensson
Demystifying Open Distro for Elasticsearch
Suman Debnath
Future of Data
Shivam Ahuja
Tea Break
gRPC with C# and .Net Core
Mangesh Gaherwar
Panel 1
Essentials of Cloud security
Parveen Malik
Power platform and Dynamics 365
Deepesh Somani
Microservices - the gRPC Way
Viswanatha Swamy
Panel 2
Reserved
Reserved
Closing Note & Prize Distribution
JSON Converters in System.Text.Json: A Practical Guide
When you serialise and deserialise objects in .NET, the default behaviour of System.Text.Json handles a lot of ground. It happily round-trips primitive types, collections, plain C# classes, records, and dictionaries out of the box, and it does so with allocations an order of magnitude lower than its older sibling, Newtonsoft.Json. That speed advantage has made it the default serializer for ASP.NET Core, Azure Functions, and minimal API projects, and most teams in Sydney and Melbourne fintech shops have stopped reaching for legacy libraries when a new endpoint lands.
The trouble starts when your model does not look like vanilla .NET. You may need to round-trip a Guid as a hyphenless string, accept snake_case keys from a third-party SaaS, encode decimals as fixed-precision strings, or expose a polymorphic hierarchy where the concrete type lives in a different assembly. Custom converters exist precisely for these moments, and once you understand the lifecycle they become easier to write than they look at first glance.
Why System.Text.Json reaches for custom converters
The built-in serializer is opinionated. It assumes your property names are PascalCase, your dates are ISO-8601 strings, and your enums are integers. Any deviation requires a converter, an attribute, or a naming policy. For some cases the framework gives you a shortcut: [JsonPropertyName], [JsonConverter], and JsonNamingPolicy cover most naming tweaks without code.
For anything richer, you drop down to JsonConverter<T> and override two methods. This is where teams in Brisbane and Adelaide often discover the difference between Newtonsoft, where converter authoring is forgiving and documentation is everywhere, and System.Text.Json, where the contract is stricter but the resulting code is faster. The strictness matters once you start chasing throughput on a hot path, such as an order-matching engine in a Sydney trading firm, or a routing service running on AWS out of a Perth data centre. Another reason to write converters is version tolerance. APIs evolve, and a careful converter can accept several JSON shapes for the same field, which keeps older clients from breaking when you ship a new release.
Anatomy of the JsonConverter class
Every custom converter inherits from JsonConverter<T> and overrides Read and Write. The Read method receives a Utf8JsonReader positioned at the start of the token, and you pull values out of it as bytes. The Write method receives a Utf8JsonWriter and pushes tokens into it. Neither method is allowed to throw arbitrary exceptions for well-formed JSON; if the data is wrong, throw a JsonException so the caller can surface a sensible 400 response.
You also override CanConvert(Type) when your converter lives in a non-generic base or when you register it globally on a converter factory. The factory pattern is useful when one converter handles many types, and it is the technique Microsoft recommends for enum or type-discriminated unions. A common pattern from Canberra-based government integrators is a factory that maps a CLR interface to one of several concrete converters based on a "type" discriminator, which keeps domain models clean. A subtle but important detail: Read and Write work on raw ReadOnlySpan<byte> data. That means you cannot use JsonSerializer.Deserialize from inside Read to handle sub-objects unless you carefully manage the reader state. Most production converters copy values into local variables, then finish the token, then deserialise the captured JSON separately.
Building a converter for value types
Value types, such as structs and record struct, often need the most care. Consider a Coordinate struct with latitude and longitude, both double. You want JSON like {"lat":-33.87,"lon":151.21} rather than the default nested object. A custom converter can flatten this into a single object or, if you prefer compact output, into a string like "-33.87,151.21". The implementation reads each property name with reader.ValueSpan, compares it, and writes the corresponding token. A neat trick is to declare a static JsonEncodedText for each property name once, then reuse it across writes; that avoids re-encoding the bytes for every record.
Teams handling geospatial telemetry for fleets in Western Australia have reported measurable reductions in CPU after applying this pattern across millions of events per minute. Be careful with NaN and Infinity, which JSON technically forbids. The reader surfaces them as JsonTokenType.Number, but the writer refuses to emit them. Most converters in production normalise to null or to a sentinel string before writing, which keeps your API contract predictable across client runtimes.
Tackling polymorphic JSON models
Polymorphism is one of the trickier shapes. The server emits a base type, the wire format includes a discriminator field, and the client must instantiate the right subclass. System.Text.Json ships first-class support through [JsonDerivedType], which works for closed hierarchies, but anything dynamic or external tends to need a hand-written converter. The recipe is: read the JSON into a JsonDocument or JsonElement, inspect the discriminator, then call JsonSerializer.Deserialize with the concrete type, passing back the captured element. This pattern shows up in payment processing where the same endpoint accepts cards, bank transfers, and digital wallets, and Australian neobanks operating out of Melbourne's Docklands have built similar adapters to integrate with legacy clearing systems.
If your hierarchy is wide, prefer a registry of discriminator-to-type mappings rather than a switch statement. The registry can be populated at startup through reflection, which keeps the converter small and the types discoverable. Pair the registry with a unit test that walks every concrete subtype and round-trips a sample, because polymorphism regressions are notoriously hard to catch at runtime once the discriminator field drifts out of sync with the type catalogue.
Renaming properties and handling dictionaries
Dictionaries are where most developers get their first surprise. By default, Dictionary<string, T> serialises as a JSON object with the key as the property name. That works until the key contains characters that JSON does not allow, such as dots or colons, or until you want to enforce a casing rule across thousands of keys. A custom DictionaryConverter<TValue> can walk the reader, validate or transform keys, and write a sanitised result.
For renaming in general, weigh whether a naming policy is enough before reaching for a converter. JsonNamingPolicy.SnakeCaseLower covers string -> string mappings and is zero ceremony. A converter earns its place when the rule depends on context, for example when one set of fields is PascalCase and another is lowercase, or when a property has multiple accepted aliases depending on API version. A practical technique, used in some Perth-based mining software vendors, is to keep the public C# model stable while the wire format changes behind a converter facade. The conversion code is the only place that knows the difference, and the rest of the application keeps working when the upstream contract is renamed.
Streaming large payloads and integration with event hubs
When payloads run into hundreds of megabytes, JsonSerializer.Deserialize against a string is no longer safe. The pattern is to stream Utf8JsonReader over a PipeReader, call Read on each array element, and push it downstream without ever materialising the full document. A custom converter plays well here because you can hand the reader to it directly and let it emit one logical record at a time. This shape mirrors what Azure Event Hubs expects: a stream of discrete events rather than a single batch envelope.
The same converter that flattens a nested object for HTTP can be reused on the consumer side of an event hub pipeline. If you are exploring that world, the real-time data pipeline walkthrough on the conference site shows the end-to-end shape using Event Hubs and Stream Analytics. One pitfall: do not call JsonSerializer.Deserialize inside the streaming loop with the same options, because each call spins up its own metadata cache. Instead, cache a static JsonSerializerOptions instance and reuse it. That single change often halves allocations in a streaming consumer, which matters when you are billed per throughput unit in a multi-region Australian deployment.
Testing strategies and benchmarking
A converter that ships without tests is a converter that will break in production. The minimum test surface is a round-trip: serialise a known object, deserialise it, compare. Add negative tests for malformed input, empty strings, and boundary values like DateTime.MinValue. xUnit works fine, and most teams in Australian consultancies wire these tests into a snapshot pipeline so regressions surface before merge.
Benchmarking deserves its own project. Use BenchmarkDotNet, choose realistic payloads, and compare against a baseline of Newtonsoft with the same logic. The numbers will be predictable: System.Text.Json is typically 2x to 5x faster on writes and slightly faster on reads, with far fewer allocations. That gap widens when the converter caches JsonEncodedText and reuses a static JsonSerializerOptions instance, as covered earlier. For load testing, hook the converter into k6 or NBomber and drive traffic at production-shaped volumes. A surprising number of fast-looking converters fall over once the GC kicks in under sustained pressure, and the only way to catch that is to run the test for at least ten minutes at peak rate before declaring victory.
Comparing converter strategies at a glance
Different shapes call for different strategies, and the comparison below summarises the trade-offs you can expect when picking one approach over another.
| Approach | Best suited for | Code volume | Runtime cost | Flexibility |
|---|---|---|---|---|
Built-in attributes ([JsonPropertyName], [JsonConverter]) |
Simple renaming, one-off cases | Very low | None | Limited |
JsonNamingPolicy |
Consistent casing rules across a model | Low | Negligible | Naming only |
Custom JsonConverter<T> |
Value types, special encodings, sanitisation | Medium | Low when cached | High |
| Converter factory with discriminator | Polymorphic hierarchies | Higher upfront | Low | Very high |
| Streaming reader plus writer | Large payloads, event-hub consumers | High | Lowest allocations | Highest |
1, CBD, Maharaj Surajmal Road, Near Yamuna Sports Complex, Delhi, 110032
GENERAL QUERIES
Manish Tewatia
manish@csharpcon.com
+91-9718-431-042
TICKET QUERIES
Atul Gupta
conference@csharpcon.com
+91-9910-125-804