2016-09-30 2 views
2

Может ли кто-нибудь сказать мне, почему я получаю сообщение об ошибке при попытке вывода «dJson2.Type» в код ниже?Динамическая переменная, не работающая в C# с Json.Net

string Json1= @"[{'Id':1, 'FirstName':'John', 'LastName':'Smith'}, {'Id':2, 'FirstName':'Jane', 'LastName':'Doe'}]"; 
    dynamic dJson1= JsonConvert.DeserializeObject(Json1); 
    Console.WriteLine(dJson1.GetType()); 
    Console.WriteLine(dJson1.Type); 

    string Json2 = @"{'Id':1, 'FirstName':'John', 'LastName':'Smith'}"; 
    dynamic dJson2 = JsonConvert.DeserializeObject(Json2); 
    Console.WriteLine(dJson2.GetType()); 
    Console.WriteLine(dJson2.Type); 

Программа умирает в инструкции Console.WriteLine (dJson2.Type). Выход программы ...

Newtonsoft.Json.Linq.JArray 
Array 
Newtonsoft.Json.Linq.JObject 
(should say Object here, I think) 

Проверка локальных переменных, dJson2 имеет свойство «Тип» со значением «Объект».

+1

Какую ошибку вы получаете? –

+0

Да, сообщение об ошибке должно сообщить вам, что именно не так. –

+0

'Вызов неоднозначен между следующими методами или свойствами: 'System.Console.WriteLine (string, params object [])'' –

ответ

1

Это потому, что JObject ведет себя аналогично System.Dynamic.ExpandoObject. Попробуйте изменить свой пример:

string Json2 = @"{'Id':1, 'FirstName':'John', 'LastName':'Smith'}"; 
    dynamic dJson2 = JsonConvert.DeserializeObject(Json2); 
    dJson2.Type = "mynewfield"; 
    Console.WriteLine(dJson2.GetType()); 
    Console.WriteLine(dJson2.Type); 

Если вы хотите получить свойство базового типа вы должны бросить его (к JToken или JObject), в противном случае запрошенного имущество будет искаться в IDictionary<string, JToken> что JObject орудия.

Этот пример может помочь:

dynamic oobj = new JObject(); 
    oobj.Type = "TEST"; 
    Console.WriteLine(oobj.Type); 
    Console.WriteLine(((JObject)oobj).Type); 
+1

Huh. Имеет смысл, хотя я не уверен, что поведение - это то, что мне нравится или чего я ожидаю. Странно, что он работает для JArray, но не JObject. Во всяком случае, бросок определенно работает. То, что я закончил, было переключением на dJson2.GetType(), кастинг на фактический тип, а затем движение. Это ведет себя так, как ожидалось, если несколько verbose .... Спасибо за объяснение, DolphinSX. –

 Смежные вопросы

  • Нет связанных вопросов^_^