Преобразовать строку JSON в «сложный» класс? - PullRequest
3 голосов
/ 21 июля 2010

У меня есть эта строка 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 может преобразовать его в «универсальный» объект, но я хочу преобразовать его в более конкретный объект.Я создал этот класс:

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, похоже, не удалось преобразовать данную строку в объект User.Я попробовал некоторые методы, но они не все.

РЕДАКТИРОВАТЬ: например:

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

исключение: исключение было выдано целью вызова.можно ли эффективно преобразовать эту строку в объект, поскольку необходимо преобразовать более одного типа строк.

Спасибо

Ответы [ 2 ]

8 голосов
/ 21 июля 2010

Пара небольших вещей, и ваш код работает отлично.

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

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

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

ОБНОВЛЕНИЕ

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

2 голосов
/ 21 июля 2010

Может быть, попробовать сериализатор WCF JSON: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

Редактировать: Также обратите внимание на эту C # автоматическую десериализацию свойств JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...