Подтвердить что ты не робот

Как получить свойство из динамического JObject программно

Я разбираю строку JSON, используя JObject NewtonSoft. Как я могу получить значения из динамического объекта программно? Я хочу упростить код, чтобы не повторяться для каждого объекта.

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

Можно ли каким-либо образом извлечь блоки кода в операторах "if" для отдельного метода, например:

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

Возможно ли это, так как мы не можем использовать отражение для динамических объектов. Или я даже правильно использую JObject?

Спасибо.

4b9b3361

Ответ 1

Предполагая, что вы используете Newtonsoft.Json.Linq.JObject, вам не нужно использовать динамический. Класс JObject может принимать строковый индексатор, как словарь:

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

Надеюсь, это поможет!

Ответ 2

с динамическим ключевым словом, как показано ниже:

var x = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);

Ответ 3

Другой способ нацеливания на это - использование SelectToken (при условии, что вы используете Newtonsoft.Json):

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

Для полной документации: https://www.newtonsoft.com/json/help/html/SelectToken.htm