为非标准Json字段创建DTO

时间:2016-08-07 21:04:34

标签: c# json asp.net-web-api

如何为我认为非标准的Json字段创建数据转换对象类?

具体来说,我正在查看Rackspace Cloud Identity documentation并且有这一部分:

"token":
  {
    "RAX-AUTH:authenticatedBy": [
        "PASSWORD"
            ],
    "expires": "2014-01-09T15:08:53.645-06:00",
    "id": "123abc5368901230076b12357897898"
  }

在创建我的DTO课程条目时,我会有以下内容:

public class token
{
    public DateTime expires { get; set; }
    public string id { get; set; }
}

我如何表示Json数据字段RAX-AUTH:authenticatedBy,以便序列化处理程序可以理解并正确映射它?

更新:

我原来的问题是序列化响应,但我意识到我的更大问题是请求DTO反序列化:

{
    "auth": {
        "RAX-AUTH:domain": {
            "name":"Rackspace"
        },
        "passwordCredentials": {
            "username":"<USERNAME>",
            "password":"<PASSWORD>"
        }
    }
}

我已经测试了这些建议但是出站的Json有“域”而不是像API期望的“RAX-AUTH:域”:

[DataContract(Name="auth")]
public class CloudIdentityAuthRequest
{
    [DataMember]
    [JsonProperty("RAX-AUTH:domain")]
    public CloudIdentityDomain domain { get;  }

    [DataMember]
    public CloudIdentityPasswordCredentials passwordCredentials { get; }
}

[DataContract]
public class CloudIdentityDomain
{
    [DataMember]
    public string name { get { return "Rackspace"; } }
}

3 个答案:

答案 0 :(得分:0)

看起来该字段是一个字符串数组。您可以使用DataMember属性将该名称映射到DTO上的媒体资源:

[DataContract]
public class Token
{
    [DataMember(Name = "RAX-AUTH:authenticatedBy")]
    public string[] AuthenticatedBy { get; set; }
    [DataMember(Name = "expires")]
    public DateTime Expires { get; set; }
    [DataMember(Name = "id")]
    public string Id { get; set; }
}

答案 1 :(得分:0)

你可以使用Json.NET(从NuGET下载)你可以做这样的事情

public class Token
{
    public DateTime expires { get; set; }
    public string id { get; set; }
    [JsonProperty("RAX-AUTH:authenticatedBy")]
    public IEnumerable<string> authenticatedBy { get; set; }
}

然后你可以像

那样反序列化它
var rackSpaceAuth = JsonConvert.DeserializeObject<Token>(tokenjson);

答案 2 :(得分:0)

假设该属性将始终是一个字符串数组,并且取决于您的序列化程序,您应该能够这样做:

plotly