Simple Json C# Correct Way to Deserialize Dictionary

We are using RESTSharp Library to work with third party REST based API. Which by default support XML and JSON deserialization. but their documentation for Deserialization is covered with a limited simple example. which was not sufficient to help us consume Complex JSON output.

We are using http://json2csharp.com/ to convert JSON string to C# class. Which works perfectly when JSON string is in a simple structure. but when it comes to Deserialize to JSON to Dictionary< string, class> then class generated using json2csharp.com fails.

Example:

Consider following complex JSON response which requires Dictionary<string, class>.

JSON:


"response": {
	"1007": {
		"total": {
			"inStock": 10,
			"onHand": 9,
			"allocated": 1
		}
	},
	"1008": {
		"total": {
			"inStock": 0,
			"onHand": 0,
			"allocated": 0
		}
	}
}

Output after converting JSON to C# class using converter tool(https://json2csharp.com/):


public class Total
{
public int inStock { get; set; }
public int onHand { get; set; }
public int allocated { get; set; }
}
public class __invalid_type__1007
{
public Total total { get; set; }
}
public class Total2
{
public int inStock { get; set; }
public int onHand { get; set; }
public int allocated { get; set; }
}
public class __invalid_type__1008
{
public Total2 total { get; set; }
}
public class Response
{
public __invalid_type__1007 __invalid_name__1007 { get; set; }
public __invalid_type__1008 __invalid_name__1008 { get; set; }
}
public class RootObject
{
public Response response { get; set; }
}

Wrong way to put Dictionary:


public class Response
{
	public Dictionary<string, Product> Products { get; set; }
}

public class RootObject
{
	public Response Response { get; set; }
}

The right way to put Dictionary:


public class RootObject
{
	// We need the following minor modification to make the class correctly deserialize:
	public Dictionary<string, Product> Response { get; set; }
}

public class Product
{
	public Total Total { get; set; }
}

public class Total
{
	public int InStock { get; set; }
	public int OnHand { get; set; }
	public int Allocated { get; set; }
}
	

I hope this article saves time for you.

Thank you…!!

Article by

Chintan Prajapati

Chintan Prajapati, a seasoned computer engineer with over 20 years in the software industry, is the Founder and CEO of Satva Solutions. His expertise lies in Accounting & ERP Integrations, RPA, and developing technology solutions around leading ERP and accounting software, focusing on using Responsible AI and ML in fintech solutions. Chintan holds a BE in Computer Engineering and is a Microsoft Certified Professional, Microsoft Certified Technology Specialist, Certified Azure Solution Developer, Certified Intuit Developer, and Xero Developer.Throughout his career, Chintan has significantly impacted the accounting industry by consulting and delivering integrations and automation solutions that have saved thousands of man-hours. He aims to provide readers with insightful, practical advice on leveraging technology for business efficiency.Outside of his professional work, Chintan enjoys trekking and bird-watching. Guided by the philosophy, "Deliver the highest value to clients". Chintan continues to drive innovation and excellence in digital transformation strategies from his base in Ahmedabad, India.