How to get property from dynamic JObject programmatically

62,939

Solution 1

Assuming you're using the Newtonsoft.Json.Linq.JObject, you don't need to use dynamic. The JObject class can take a string indexer, just like a dictionary:

JObject myResult = GetMyResult();
returnObject.Id = myResult["string here"]["id"];

Hope this helps!

Solution 2

Another way of targeting this is by using SelectToken (Assuming that you're using Newtonsoft.Json):

JObject json = GetResponse();
var name = json.SelectToken("items[0].name");

For a full documentation: https://www.newtonsoft.com/json/help/html/SelectToken.htm

Share:
62,939
dcdroid
Author by

dcdroid

Updated on July 09, 2022

Comments

  • dcdroid
    dcdroid almost 2 years

    I'm parsing a JSON string using the NewtonSoft JObject. How can I get values from a dynamic object programmatically? I want to simplify the code to not repeat myself for every object.

    public ExampleObject GetExampleObject(string jsonString)
    {
    ExampleObject returnObject = new ExampleObject();
    dynamic dynamicResult = JObject.Parse(jsonString);
    if (!ReferenceEquals(dynamicResult.album, null))
       {
           //code block to extract to another method if possible
           returnObject.Id = dynamicResult.album.id; 
           returnObject.Name = dynamicResult.album.name;
           returnObject.Description = dynamicResult.albumsdescription;
           //etc..
       }
    else if(!ReferenceEquals(dynamicResult.photo, null))
       {
           //duplicated here
           returnObject.Id = dynamicResult.photo.id;
           returnObject.Name = dynamicResult.photo.name;
           returnObject.Description = dynamicResult.photo.description;
           //etc..
       }
    else if..
    //etc..
    
    return returnObject;
    }
    

    Is there any way I can extract the code blocks in the "if" statements to a separate method e.g:

    private void ExampleObject GetExampleObject([string of desired type goes here? album/photo/etc])
    {
      ExampleObject returnObject = new ExampleObject();
      returnObject.Id = dynamicResult.[something goes here?].id;
      returnObject.Name = dynamicResult.[something goes here?].name;
      //etc..
      return returnObject;
    }
    

    Is it even possible since we can't use reflection for dynamic objects. Or am I even using the JObject correctly?

    Thanks.