Working with JSON in CSharp - potatoscript/json GitHub Wiki
In C#, JSON is a commonly used format for data exchange, particularly when working with APIs, web services, or configuration files. The .NET framework provides powerful libraries for working with JSON, such as Newtonsoft.Json (also known as Json.NET) and the System.Text.Json library.
In this tutorial, we will explore how to parse, serialize, and deserialize JSON data in C# using both libraries, as well as how to handle more advanced JSON scenarios.
JSON (JavaScript Object Notation) is a lightweight data-interchange format that is easy for humans to read and write and easy for machines to parse and generate. JSON is often used for transmitting data in web applications.
In C#, you can use JSON to:
- Send data to and receive data from APIs (via HTTP).
- Store and load application settings in a structured format.
- Exchange data between different components of a system.
Before diving into coding, let's make sure your C# environment is ready.
- Create a new C# project (Console App, Web API, etc.) in Visual Studio or Visual Studio Code.
- Install the necessary NuGet package for JSON handling.
If you're using Newtonsoft.Json, you can install it by running:
Install-Package Newtonsoft.Json
If you're using System.Text.Json (included in .NET Core and .NET 5+), you don't need any additional packages.
Serializing (Converting an Object to JSON)
To serialize an object into JSON using Newtonsoft.Json, you use the JsonConvert.SerializeObject()
method.
Example:
using Newtonsoft.Json;
using System;
class Program
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void Main()
{
// Create an object
var person = new Person
{
Name = "John Doe",
Age = 30
};
// Serialize the object to JSON
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json);
}
}
Output:
{"Name":"John Doe","Age":30}
Deserializing (Converting JSON to an Object)
To convert a JSON string into an object, you can use the JsonConvert.DeserializeObject<T>()
method.
Example:
using Newtonsoft.Json;
using System;
class Program
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void Main()
{
// Sample JSON
string json = "{\"Name\":\"John Doe\",\"Age\":30}";
// Deserialize the JSON into an object
Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
}
Output:
Name: John Doe, Age: 30
Starting with .NET Core 3.0 and .NET 5+, System.Text.Json is the built-in JSON library. It is lightweight and faster than Newtonsoft.Json but doesn't have as many features yet.
Serializing (Converting an Object to JSON)
To serialize an object into JSON using System.Text.Json, you use the JsonSerializer.Serialize()
method.
Example:
using System;
using System.Text.Json;
class Program
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void Main()
{
// Create an object
var person = new Person
{
Name = "John Doe",
Age = 30
};
// Serialize the object to JSON
string json = JsonSerializer.Serialize(person);
Console.WriteLine(json);
}
}
Output:
{"Name":"John Doe","Age":30}
Deserializing (Converting JSON to an Object)
To convert a JSON string into an object, you can use the JsonSerializer.Deserialize<T>()
method.
Example:
using System;
using System.Text.Json;
class Program
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void Main()
{
// Sample JSON
string json = "{\"Name\":\"John Doe\",\"Age\":30}";
// Deserialize the JSON into an object
Person person = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
}
Output:
Name: John Doe, Age: 30
In many cases, JSON data might be an array of objects rather than just a single object. Let's look at how to handle JSON arrays in C#.
Example:
JSON:
[
{ "Name": "John", "Age": 30 },
{ "Name": "Jane", "Age": 25 },
{ "Name": "Jack", "Age": 35 }
]
Deserialization in C#:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
class Program
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void Main()
{
// Sample JSON array
string json = "[{\"Name\":\"John\",\"Age\":30},{\"Name\":\"Jane\",\"Age\":25},{\"Name\":\"Jack\",\"Age\":35}]";
// Deserialize the JSON array into a list of Person objects
List<Person> people = JsonConvert.DeserializeObject<List<Person>>(json);
foreach (var person in people)
{
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
}
}
Output:
Name: John, Age: 30
Name: Jane, Age: 25
Name: Jack, Age: 35
JSON data can have nested objects or arrays. Let's see how to work with nested data.
Example of Nested JSON:
{
"person": {
"name": "John Doe",
"address": {
"street": "123 Main St",
"city": "Anytown"
}
}
}
Deserialization in C#:
using Newtonsoft.Json;
using System;
class Program
{
class Address
{
public string Street { get; set; }
public string City { get; set; }
}
class Person
{
public string Name { get; set; }
public Address Address { get; set; }
}
static void Main()
{
// Sample nested JSON
string json = "{\"person\":{\"name\":\"John Doe\",\"address\":{\"street\":\"123 Main St\",\"city\":\"Anytown\"}}}";
// Deserialize the nested JSON into a Person object
var result = JsonConvert.DeserializeObject<dynamic>(json);
var person = result.person;
Console.WriteLine($"Name: {person.name}");
Console.WriteLine($"Street: {person.address.street}");
Console.WriteLine($"City: {person.address.city}");
}
}
Output:
Name: John Doe
Street: 123 Main St
City: Anytown
Sometimes, JSON data may be malformed, or the data might not match the expected structure. It’s essential to handle errors gracefully.
Example:
using Newtonsoft.Json;
using System;
class Program
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
static void Main()
{
// Malformed JSON (missing a closing quote)
string json = "{\"Name\":\"John Doe\", \"Age\":30";
try
{
Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.Name);
}
catch (JsonException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Output:
Error: Unexpected end of content while loading object. Path '', line 1, position 37.
Working with JSON in C# is simple and straightforward with powerful libraries like Newtonsoft.Json and System.Text.Json. These libraries allow you to serialize and deserialize JSON data, handle nested JSON objects, work with arrays, and much more.
When developing with APIs, web services, or configuration files, understanding how to work with JSON will help you manage data effectively and optimize your application’s performance.