Json Serialization And Deserialization In C# Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    6 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of JSON Serialization and Deserialization in C#

JSON Serialization and Deserialization in C#

Key Components:

  1. System.Text.Json Namespace: Introduced in .NET Core 3.0, this namespace provides a fast, low-allocating, and standards-compliant JSON serializer and deserializer for use with the System.Object type in C#. The JsonSerializer class in this namespace handles the conversion between JSON and C# objects.

  2. Newtonsoft.Json (Json.NET): Before System.Text.Json, the Newtonsoft.Json package was widely used. It offers a robust and flexible set of features to handle JSON data in C#. Newtonsoft.Json is compatible with various .NET versions.

Serialization:

Serialization is the process of converting a C# object into a JSON string. The System.Text.Json namespace provides a straightforward API for this.

Using System.Text.Json:

using System;
using System.Text.Json;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };
        string jsonString = JsonSerializer.Serialize(person);
        Console.WriteLine(jsonString);  // Output: {"Name":"John Doe","Age":30}
    }
}

Using Newtonsoft.Json:

using System;
using Newtonsoft.Json;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };
        string jsonString = JsonConvert.SerializeObject(person);
        Console.WriteLine(jsonString);  // Output: {"Name":"John Doe","Age":30}
    }
}

Deserialization:

Deserialization is the inverse process, converting a JSON string into a C# object.

Using System.Text.Json:

string jsonString = "{\"Name\":\"John Doe\",\"Age\":30}";
Person person = JsonSerializer.Deserialize<Person>(jsonString);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");  // Output: Name: John Doe, Age: 30

Using Newtonsoft.Json:

string jsonString = "{\"Name\":\"John Doe\",\"Age\":30}";
Person person = JsonConvert.DeserializeObject<Person>(jsonString);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");  // Output: Name: John Doe, Age: 30

Customization:

Both libraries offer extensive customization options, including handling custom data types, modifying date formats, ignoring null values, and more.

Customizing Output with System.Text.Json:

var options = new JsonSerializerOptions
{
    WriteIndented = true,  // Pretty prints JSON
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase  // Converts property names to camelCase
};

string jsonString = JsonSerializer.Serialize(person, options);
Console.WriteLine(jsonString);

Customizing Output with Newtonsoft.Json:

var settings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,  // Pretty prints JSON
    NullValueHandling = NullValueHandling.Ignore  // Ignores null properties
};

string jsonString = JsonConvert.SerializeObject(person, settings);
Console.WriteLine(jsonString);

Handling Complex Types:

Both libraries can handle complex types such as collections, nested objects, and enums seamlessly.

Using System.Text.Json:

class Company
{
    public string Name { get; set; }
    public List<Person> Employees { get; set; }
}

Company company = new Company
{
    Name = "Tech Corp",
    Employees = new List<Person>
    {
        new Person { Name = "John Doe", Age = 30 },
        new Person { Name = "Jane Smith", Age = 25 }
    }
};

string jsonString = JsonSerializer.Serialize(company);
Console.WriteLine(jsonString);

Using Newtonsoft.Json:

Company company = new Company
{
    Name = "Tech Corp",
    Employees = new List<Person>
    {
        new Person { Name = "John Doe", Age = 30 },
        new Person { Name = "Jane Smith", Age = 25 }
    }
};

string jsonString = JsonConvert.SerializeObject(company);
Console.WriteLine(jsonString);

Conclusion:

JSON serialization and deserialization are fundamental for building robust applications that can interact with web services, store data, and transmit information efficiently. The System.Text.Json namespace is modern and preferred for new projects in .NET, whereas Newtonsoft.Json remains a powerful alternative with more advanced features and broader compatibility.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement JSON Serialization and Deserialization in C#

Using System.Text.Json

Example: Serializing and Deserializing a Custom Object

  1. Define a C# Class:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }
    
  2. Serialize the Object to JSON:

    using System;
    using System.Text.Json;
    
    public class JsonExample
    {
        public void SerializePersonToJson()
        {
            Person person = new Person
            {
                Name = "John Doe",
                Age = 30,
                Email = "johndoe@example.com"
            };
    
            string jsonString = JsonSerializer.Serialize(person);
            Console.WriteLine(jsonString);
        }
    
        public static void Main(string[] args)
        {
            JsonExample example = new JsonExample();
            example.SerializePersonToJson();
        }
    }
    

    Output:

    {"Name":"John Doe","Age":30,"Email":"johndoe@example.com"}
    
  3. Deserialize the JSON to an Object:

    using System;
    using System.Text.Json;
    
    public class JsonExample
    {
        public void DeserializeJsonToPerson()
        {
            string jsonString = "{\"Name\":\"John Doe\",\"Age\":30,\"Email\":\"johndoe@example.com\"}";
    
            Person person = JsonSerializer.Deserialize<Person>(jsonString);
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Email: {person.Email}");
        }
    
        public static void Main(string[] args)
        {
            JsonExample example = new JsonExample();
            example.DeserializeJsonToPerson();
        }
    }
    

    Output:

    Name: John Doe, Age: 30, Email: johndoe@example.com
    

Using Newtonsoft.Json (Json.NET)

Example: Serializing and Deserializing a Custom Object

  1. Install Newtonsoft.Json:

    • Using NuGet Package Manager: Install-Package Newtonsoft.Json
  2. Define a C# Class:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }
    
  3. Serialize the Object to JSON:

    using System;
    using Newtonsoft.Json;
    
    public class JsonExample
    {
        public void SerializePersonToJson()
        {
            Person person = new Person
            {
                Name = "John Doe",
                Age = 30,
                Email = "johndoe@example.com"
            };
    
            string jsonString = JsonConvert.SerializeObject(person);
            Console.WriteLine(jsonString);
        }
    
        public static void Main(string[] args)
        {
            JsonExample example = new JsonExample();
            example.SerializePersonToJson();
        }
    }
    

    Output:

    {"Name":"John Doe","Age":30,"Email":"johndoe@example.com"}
    
  4. Deserialize the JSON to an Object:

    using System;
    using Newtonsoft.Json;
    
    public class JsonExample
    {
        public void DeserializeJsonToPerson()
        {
            string jsonString = "{\"Name\":\"John Doe\",\"Age\":30,\"Email\":\"johndoe@example.com\"}";
    
            Person person = JsonConvert.DeserializeObject<Person>(jsonString);
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Email: {person.Email}");
        }
    
        public static void Main(string[] args)
        {
            JsonExample example = new JsonExample();
            example.DeserializeJsonToPerson();
        }
    }
    

    Output:

    Name: John Doe, Age: 30, Email: johndoe@example.com
    

Summary

  • Serialization: Converting a C# object into a JSON string.
  • Deserialization: Converting a JSON string back into a C# object.

Both System.Text.Json and Newtonsoft.Json offer robust functionalities to handle JSON data in C#. While System.Text.Json is part of the .NET library and is suitable for most use cases, Newtonsoft.Json is more feature-rich and might be preferred for complex scenarios.

Top 10 Interview Questions & Answers on JSON Serialization and Deserialization in C#

1. What is JSON Serialization and Deserialization?

Answer: JSON (JavaScript Object Notation) Serialization is the process of converting a C# object into a JSON string. Deserialization is the reverse process, converting a JSON string back into a C# object. This is crucial for web services, APIs, and data storage in modern applications.

2. What are the primary libraries for JSON Serialization/Deserialization in C#?

Answer: The most commonly used libraries are:

  • System.Text.Json: A high-performance, low-allocating serializer/deserializer brought in C# 8.0 and later enhanced in .NET Core and .NET 5+.
  • Newtonsoft.Json (Json.NET): A more mature and feature-rich library; highly customizable and widely used before the introduction of System.Text.Json.

3. How can I serialize a C# object to a JSON string using System.Text.Json?

Answer: Use the JsonSerializer.Serialize method.

using System.Text.Json;

var person = new Person { Name = "John Doe", Age = 30 };
string jsonString = JsonSerializer.Serialize(person);

4. How can I deserialize a JSON string to a C# object using System.Text.Json?

Answer: Use the JsonSerializer.Deserialize method.

string jsonString = "{\"Name\":\"John Doe\",\"Age\":30}";
var person = JsonSerializer.Deserialize<Person>(jsonString);

5. How do I handle custom date/time formats during serialization/deserialization in System.Text.Json?

Answer: Use JsonSerializerOptions to specify the date format.

string customDateJson = "{\"Name\":\"John Doe\",\"BirthDate\":\"2022-12-25T00:00:00\"}";
var options = new JsonSerializerOptions
{
    Converters = { new DateTimeConverterUsingDateTimeParse() } // Use a custom converter
};
var person = JsonSerializer.Deserialize<Person>(customDateJson, options);

6. How to ignore null values when serializing an object in Newtonsoft.Json?

Answer: Use the NullValueHandling property in JsonSerializerSettings.

var person = new Person { Name = "John Doe" }; // Age is null
var options = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore 
};
string jsonString = JsonConvert.SerializeObject(person, options);

7. How can I deserialize a JSON array to a list of C# objects?

Answer: Deserialize it using JsonSerializer.Deserialize<List<T>>() or JsonConvert.DeserializeObject<List<T>>().

string jsonArray = "[{\"Name\":\"John Doe\"},{\"Name\":\"Jane Smith\"}]";
var people = JsonSerializer.Deserialize<List<Person>>(jsonArray);

8. What is the difference between PropertyNamePolicy and NamingPolicy in JsonSerializerOptions?

Answer: PropertyNamePolicy affects the JSON property names emitted during serialization and read during deserialization of dictionary keys. NamingPolicy is used to convert the names of properties, fields, and dictionary keys in the .NET objects to the specified casing policy during serialization and deserialization.

9. How can I make a property in a C# class optional for JSON serialization in Newtonsoft.Json?

Answer: Use the DefaultValueHandling option and [JsonProperty] attribute.

public class Book
{
    public string Title { get; set; }

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public string Description { get; set; }
}

10. How can I handle cases where the JSON structure does not match the C# object structure duringERCHANTABILITY deserialization?

Answer: Use the MissingMemberHandling option in JsonSerializerSettings or System.Text.JsonOptions to ignore missing members, or leverage custom converters to handle discrepancies.

You May Like This Related .NET Topic

Login to post a comment.