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

Deserializing oData to a sane object with ServiceStack

这就是我从 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
      }
   ]
}

我想将其反序列化为一个简单的 class,就像重要的东西(Id、用户名等...到最后)。

我已经 class 创建了,但是对于我的生活,我无法弄清楚如何丢弃 oData 放置在这个东西周围的所有包装器对象。

任何人都可以解释一下吗?

可以使用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];