2010-07-21 3 views
3

У меня есть эта строка JSON:Преобразование строки JSON в «сложный» класс?

{ 
"success":true,"user_id":"309","id":"309","sessId":false,"email":null,"name":"Mai Van Quan","username":"quanmv","role":"Reseller Admin","messages":"","org_name":null,"microPayNumber":"4949","microPayWord":"neocam","mobile":null,"permissions":{"ADD_CAMERA":true, 
    "REMOVE_CAMERA":true, 
    "EDIT_CAM_GENERAL":true, 
    "ACCESS_CAM_TECHNICAL":true, 
    "EDIT_CAM_PKG":true, 
    "PREVIEW_CAM":true 
    },"type":"sp","time":1279702793,"reseller":1,"status":"ok"} 

Я хочу, чтобы преобразовать его в объект C#, используя Json.NET. JSON.NET может преобразовать его в объект «generics», но я хочу преобразовать его в более конкретный объект. Я создал этот класс:

internal class User 
    { 

     public User(User u) 
     { 
      status = u.status; 
      id = u.id; 
      sessId = u.sessId; 
      email = u.email; 
      username = u.username; 
      role = u.role; 
      messages = u.messages; 
      org_name = u.org_name; 
      microPayNumber = u.microPayNumber; 
      microPayWorld = u.microPayWorld; 
      mobile = u.mobile; 
      permissions = u.permissions; 
      type = u.type; 
      time = u.time; 
      reseller = u.reseller; 
      status = u.status; 
     } 

     public bool successs { private set; get; } 


     public string user_id { private set; get; } 
     public string id { private set; get; } 



     public string name { private set; get; } 
     public bool sessId { private set; get; } 
     public string email { private set; get; } 

     public string username { private set; get; } 

     public string role { private set; get; } 
     public string messages { private set; get; } 
     public string org_name{ private set; get; } 
     public string microPayNumber { private set; get; } 
     public string microPayWorld { private set; get; } 
     public string mobile { private set; get; } 
     public Dictionary<string,bool> permissions { private set; get; } 
     public string type { private set; get; } 

     public int time { private set; get; } 

     public int reseller { private set; get; } 
     public string status { private set; get; } 

} 

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

EDIT: например:

var ob = JsonConvert.DeserializeObject<User>(str); 

исключения: Исключение было брошено в адресат вызова.

Как я могу преобразовать эту строку в объект, эффективно, потому что необходимо преобразовать несколько типов строк.

Спасибо

+0

у вас есть сообщение об ошибке? –

+3

«они провалили все», это не очень описательно. Объясните, что вы пробовали, и что произошло. Я не был бы полностью удивлен, если бы это было неудачно из-за создателей частной собственности. –

+0

@jon: +1 для просмотра частного набора ... :) –

ответ

8

Пара мелких вещей, и у меня есть свой код работает Великий.

Первое: вы получили исключение NullReferenceException. Свойство permissions вашего класса User не было создано. Json.NET не создает его для вас. Я добавил конструктор по умолчанию это к вашему User класс:

public User() 
{ 
    permissions = new Dictionary<string, bool>(); 
} 

Вторая вещь: Это не работает с private или internal сеттеров на свойства User класса. Как только я изменил их на public, он работал отлично.

UPDATE

еще одно открытие. Если вы пометили свой класс User атрибутом [JsonObject], и каждый из ваших свойств с атрибутом [JsonProperty], то вы можете оставить свои сеттеры либо private, либо internal, и все отлично работает.

+0

+1 для [JsonProperty] !! –

+0

Как я могу вас поблагодарить? Он отлично работает: D – Vimvq1987