2016-03-04 2 views
1

У меня есть следующая проблема:JSON Deserialize Объект не работает

(UserAttribues)Newtonsoft.Json.JsonConvert.DeserializeObject("{\"username\":\"Someone\"}"); 

выдает ошибку:

"Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'UserAttribues'." 

Класс прост, как:

[Serializable] 
public class UserAttribues 
{ 
    public string username; 
} 

Любая помощь приветствуется. (Я также попробовал «{\" имя_пользователя \ ": \" \ "Кто-то \" \ "}")

+1

Вы попробовали общую версию? 'JsonConvert.DeserializeObject (...' – Crowcoder

+0

oh, что на самом деле сработало ... Можете ли вы объяснить, почему? (Если вы отправляете в качестве ответа, то не принимайте его) – MMMagic

+1

Я не хочу красть ответ от @StarterPack, но это связано с тем, что вы конкретно говорите о том, какой тип вам нужен, и он сделает все возможное, чтобы нанести на карту поля. С помощью броска вы полагаетесь на совместимость типов. C# не просто знает, как сопоставлять членов типа между любыми двумя типами. – Crowcoder

ответ

7

Вы можете использовать JsonConvert.Deserialize для этого. Используйте это так:

var attr = JsonConvert.DeserializeObject<UserAttribues>("{\"username\":\"Someone\"}"); 
2

При использовании необщей версии методы DeserializeObject() вы получите JObject. Как видно из этой ошибки, вы не можете отнести этот объект JObject к объекту UserAttributes. Причина заключается в том, что в определенных случаях допускается разливка типов, например, литье между совместимыми примитивными типами (например, между int и double) или между связанными классами.

Например, если у нас есть базовый класс и производный класс, class Animal и class Reptile : Animal, вы можете смело отбрасывать объект типа рептилий животных, или наоборот (если ваш объект действительно Рептилия, в противном случае вам «Возникнет ошибка»).

Поэтому причина, по которой ваш образец кода не работает, заключается в том, что JObject, который у вас есть, и пользовательские атрибуты, которые вы хотите получить, никак не связаны. Решение, как уже указывалось @StarterPack, заключается в использовании общей версии DeserializeObject<some_type>().

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