366

I happily use the Newtonsoft JSON library. For example, I would create a JObject from a .NET object, in this case an instance of Exception (might or might not be a subclass)

if (result is Exception)
    var jobjectInstance = JObject.FromObject(result);

now I know the library can deserialize JSON text (i.e. a string) to an object

// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

but what I am looking for is:

// now i do already have an JObject instance
Exception exception = jobjectInstance.????

Well it is clear that I can go from on JObject back to JSON text and then use the deserialize functionality, but that seems backwards to me.

3 Answers 3

714

According to this post, it's much better now:

// pick out one album
JObject jalbum = albums[0] as JObject;

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();

Documentation: Convert JSON to a Type

6
  • 12
    Any ideas on the performance implications here? Will reflection be used every time? Nov 2, 2013 at 21:46
  • 2
    Is it possible to do this with a custom JsonConverter? Dec 16, 2015 at 17:00
  • 4
    Thank you for the hint. It helped me a lot. Let me add something: In a generic method where I am using type T, I required something like result=(value is JObject) ? ((JObject)value).ToObject<T>() : (T)default(T); to successfully convert it (note - value is an object coming from a database which might be a JObject or something else in which case result should be null).
    – Matt
    Feb 23, 2016 at 9:15
  • @ShaunRowan Playing around with code in Linqpad, it does look like reflection is used to match the property at the same "level" of the target object as the corresponding field in the JSON object. The name of your property has to match the name of the JSON field, and the type of your property has to be a compatible type.
    – BobbyA
    Dec 18, 2017 at 16:33
  • and use jobject.ToObject(myObject.GetType()) if you don't know the object type.
    – Tohid
    Mar 23, 2020 at 14:27
58

From the documentation, I found this:

JObject o = new JObject(
   new JProperty("Name", "John Smith"),
   new JProperty("BirthDate", new DateTime(1983, 3, 20))
);

JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));

Console.WriteLine(p.Name);

The class definition for Person should be compatible to the following:

class Person {
    public string Name { get; internal set; }
    public DateTime BirthDate { get; internal set; }
}

If you are using a recent version of JSON.net and don't need custom serialization, please see Tien Do's answer, which is more concise.

1
  • 3
    I needed to use this approach, rather than the shorthand, to be able to pass custom serialization settings. Jul 23, 2015 at 16:13
3

Too late, just in case some one is looking for another way:

void Main()
{
    string jsonString = @"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
}";

    Product product = new Product();
    //Serializing to Object
    Product obj = JObject.Parse(jsonString).SelectToken("$.Manufacturers[?(@.Name == 'Acme Co' && @.Name != 'Contoso')]").ToObject<Product>();

    Console.WriteLine(obj);
}


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}
1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.