使用ServiceStack将oData反序列化为一个合理的对象

时间:2015-09-30 18:45:56

标签: servicestack odata servicestack-text

所以,这就是我从oData服务中获得的......

{  
   "odata.metadata":"http://server.ca/Mediasite/Api/v1/$metadata#UserProfiles",
   "value":[  
      {  
         "odata.id":"http://server.ca/Mediasite/Api/v1/UserProfiles('111111111111111')",
         "QuotaPolicy@odata.navigationLinkUrl":"http://server.ca/Mediasite/Api/v1/UserProfiles('111111111111111')/QuotaPolicy",
         "#SetQuotaPolicyFromLevel":{  
            "target":"http://server.ca/Mediasite/Api/v1/UserProfiles('111111111111111')/SetQuotaPolicyFromLevel"
         },
         "Id":"111111111111111",
         "UserName":"testuser",
         "DisplayName":"testuser Large",
         "Email":"testuser@testuser.ca",
         "Activated":true,
         "HomeFolderId":"312dcf4890df4b129e248a0c9a57869714",
         "ModeratorEmail":"testuser@testuserlarge.ca",
         "ModeratorEmailOptOut":false,
         "DisablePresentationContentCompleteEmails":false,
         "DisablePresentationContentFailedEmails":false,
         "DisablePresentationChangeOwnerEmails":false,
         "TimeZone":26,
         "PresenterFirstName":null,
         "PresenterMiddleName":null,
         "PresenterLastName":null,
         "PresenterEmail":null,
         "PresenterPrefix":null,
         "PresenterSuffix":null,
         "PresenterAdditionalInfo":null,
         "PresenterBio":null,
         "TrustDirectoryEntry":null
      }
   ]
}

我想将它反序列化为一个简单的类,比如重要的东西(Id,用户名等......到最后)。

我有我的班级创建,但对于我的生活,我无法弄清楚如何丢弃所有包装对象oData放置这个东西。

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:2)

您可以使用JsonObject动态遍历JSON,例如:

var users = JsonObject.Parse(json).ArrayObjects("value")
    .Map(x => new User
    {
        Id = x.Get<long>("Id"),
        UserName = x["UserName"],
        DisplayName = x["DisplayName"],
        Email = x["Email"],
        Activated = x.Get<bool>("Activated"),
    });

users.PrintDump();

或者将其反序列化为与JSON形状匹配的模型,例如:

public class ODataUser
{
    public List<User> Value { get; set; }
}

public class User
{
    public long Id { get; set; }
    public string UserName { get; set; }
    public string DisplayName { get; set; }
    public string Email { get; set; }
    public bool Activated { get; set; }
    public string HomeFolderId { get; set; }
    public string ModeratorEmail { get; set; }
    public bool ModeratorEmailOptOut { get; set; }
    public bool DisablePresentationContentCompleteEmails { get; set; }
    public bool DisablePresentationContentFailedEmails { get; set; }
    public bool DisablePresentationChangeOwnerEmails { get; set; }
    public int TimeZone { get; set; }
}

var odata = json.FromJson<ODataUser>();
var user = odata.Value[0];