Deserialize JSON to anonymous object

C#asp.netJson

C# Problem Overview


In C#, I have successfully serialized an anonymous object into JSON by use of code like this...

var obj = new { Amount = 108, Message = "Hello" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);

However, what I would like to be able to do later is to deserialize the JSON string back into an anonymous object. Something like this...

var obj2 = serializer.Deserialize(output, object);

But the serializer.Deserialize() method requires a second parameter that is the type of object it will deserialize to.

I tried this...

var obj2 = serializer.Deserialize(output, obj.GetType());

But this produces an error:

> No parameterless constructor defined for type of '<>f__AnonymousType0`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

I'm not sure what this error means.

C# Solutions


Solution 1 - C#

how about dynamics, the fastest way I see is this:

dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;

Note: You will need Newtonsoft.json.dll reference

Solution 2 - C#

JSON.Net is a powerful library to work with JSON in .Net

There's a method DeserializeAnonymousType you can tap in to.

Update: Json.Net is now included with ASP.Net, however my latest favorite that I use is JsonFX. It's got great linq support as well, check it out.

Update 2: I've moved on from JsonFX, and currently use ServiceStack.Text, it's fast!

Solution 3 - C#

How about using the DeserializeObject method, it does not require a specific type. This also solved a similar SO question. The method deserializes to a Dictionary<string, object> containing name/value pairs.

Update: to clarify the error you get when doing this:

var obj2 = serializer.Deserialize(output, obj.GetType());

Given the type of obj, Deserialize will try to create a new instance of the type using a default constructor. Anonymous types in C# does not have a public parameterless constructor, and thus the operation fails.

Solution 4 - C#

This can also be done using the in-built JavaScriptSerializer, as follows:

object result = new JavaScriptSerializer().DeserializeObject(JSONData);

This will return an object[] instance, with Key-Value pairs.

Solution 5 - C#

Recently I have been using the awesome JsonFx.Net library and I've come to appreciate what it does. You can use Nuget Package Manager to install it right inside Visual Studio.

The code goes like this,

var reader = new JsonReader();
string input = @"{ ""first"": ""Foo"", ""last"": ""Bar"" }";
var template = new { first=String.Empty, middle=String.Empty, last=String.Empty };
var output = reader.Read(input, template);

As you can see you can even specify the template for Anonymous Type.

Solution 6 - C#

You can do it using NewtonSoft.Json's DeserializeAnonymousType method.

The below example can even deserialize JSON to a list of anonymous objects. Use whichever definition you want it to deserialize to.

var json = System.IO.File.ReadAllText(@"C:\TestJSONFiles\yourJSONFile.json");
var fooDefinition = new { a = "", b = 0 }; // type with fields of string, int
var fooListDefinition = Enumerable.Range(0, 0).Select(e => fooDefinition).ToList();

var foos = JsonConvert.DeserializeAnonymousType(json, fooListDefinition);

Solution 7 - C#

You can use JObject instead to deserialize the JSON string:

using Newtonsoft.Json.Linq;

string output = "{\"Amount\" = 108, \"Message\" = \"Hello\"}";
var amount = JObject.Parse(output)["Amount"];

Solution 8 - C#

if you use Newtonsoft.Json you can try DeserializeAnonymousType method

	var obj1 = new { Amount = 108, Message = "Hello" };
	var json=JsonConvert.SerializeObject(obj1);

	// or as well
	var json= "{ \"Amount\" : 108, \"Message\" : \"Hello\" }";
   
   //Deserialization

   var definition = new { Amount = 0, Message = "" };

    //obj2 type is "anonymous"
   var obj2 = JsonConvert.DeserializeAnonymousType(json,definition); 

result

{ Amount = 108, Message = "Hello" }

Solution 9 - C#

If you do not want to manually provide the type i found the easyest way is just:

var jsonString = JsonHelper.SerializeObject(item);
ExpandoObject obj = JsonHelper.DeserializeObject<ExpandoObject>(jsonString);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjdavisView Question on Stackoverflow
Solution 1 - C#i31nGoView Answer on Stackoverflow
Solution 2 - C#VinView Answer on Stackoverflow
Solution 3 - C#Peter LillevoldView Answer on Stackoverflow
Solution 4 - C#XtraSimplicityView Answer on Stackoverflow
Solution 5 - C#VinView Answer on Stackoverflow
Solution 6 - C#Ash KView Answer on Stackoverflow
Solution 7 - C#RBTView Answer on Stackoverflow
Solution 8 - C#SergeView Answer on Stackoverflow
Solution 9 - C#Jeroen79View Answer on Stackoverflow