将JSON字符串转换为“复杂”的类?

3

I have this JSON string:

 {
"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"}

我希望使用JSON.NET将其转换为C#对象。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似乎无法将给定的字符串转换为一个用户对象。我尝试了一些方法,但它们都失败了。
编辑:例如:
var ob = JsonConvert.DeserializeObject<User>(str);

异常: 目标方法调用引发了异常。

如何高效地将此字符串转换为对象,因为有多种类型的字符串需要转换。

谢谢。


你是否收到任何错误信息? - user57508
3
“他们全都失败了”这个说法不够具体。请解释一下你尝试了什么,以及发生了什么情况。如果由于私有属性设置器的原因而导致失败,我也不会完全感到惊讶。 - Jon Skeet
@jon:看到私有集合加一(+1)... :) - user57508
@Jon Skeet:我把所有访问修饰符都改成了“public”,但异常仍然存在 :) - Quan Mai
2个回答

8

有几个小问题,我已经把你的代码跑起来了。

第一件事:你遇到了一个空引用异常。你的User类中的permissions属性从未被实例化。Json.NET 不会自动创建它。我在你的User类中添加了这个默认构造函数:

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

第二件事:它不能与User类的属性上的privateinternal setter一起使用。一旦我将它们更改为public,它就可以正常工作了。
更新:
还有一个发现。如果你在User类上打上[JsonObject]属性,并在每个属性上打上[JsonProperty]属性,那么你可以将setter保留为privateinternal,一切都能正常工作。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接