Deserialize JSON to anonymous object

Viewed 93725

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.

9 Answers

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);

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"];

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" }

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);
Related