56
votes

In C#, I am 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.

5

5 Answers

35
votes

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!

41
votes

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

15
votes

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.

5
votes

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.

1
votes

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.