2013-04-19 2 views
14

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

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

Есть ли способ, что я могу извлечь блоки кода в «если» заявление в отдельном методе, например:

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?

Спасибо.

+1

ли jsonString строка, которая находится под вашим контролем? Или вы получаете это от другой стороны, и вам нужно общаться с ней? – MichaelD

+0

@MichaelD это с другой стороны. Я просто получаю и разбираюсь. – dcdroid

+0

Другие ответы см. В разделе [десериализация JSON для .net-объекта с использованием NewtonSoft (или linq для json, возможно?)] (Http://stackoverflow.com/q/4749639) –

ответ

23

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

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

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

+6

Что входит в '[" string here "]'? Разве «id» просто не вернет значение ID в объекте? – joelforsyth

+0

Является ли этот регистр нечувствительным? – mardok

0

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

var x = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result); 
Смежные вопросы