如何将具有OData的HttpResponseMessage转换为C#对象?

时间:2016-10-13 07:44:22

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

我从连接到CRM的C#应用​​程序调用REST服务。 这将返回HttpResponseMessage。

response.Content.ReadAsStringAsync().Result

以上语句返回以下输出。我需要将此转换为Account对象,该对象已经具有" accountnumber和accountid属性。

  

{
  " @ odata.context":" https://APIURL/api/data/v8.1/ $元数据#帐户(ACCOUNTNUMBER)""值":[       {         " @ odata.etag":" W / \" 12496866 \""" ACCOUNTNUMBER":" D00208&#34 ;," ACCOUNTID":" 30417c0f-7b8c-e611-80f3-5065f38bd4d1"       }]}

我尝试过以下代码

Account return = JsonConvert.DeserializeObject<Account>(response.Content.ReadAsStringAsync().Result);

但是这并没有填满对象,并且它在accountnumber和accountid字段中总是有空值。

如何正确地将此响应转换为C#类型的任何想法。

3 个答案:

答案 0 :(得分:3)

你应该这样做 -

public class Value
{
    [JsonProperty("@odata.etag")]
    public string etag { get; set; }
    public string accountnumber { get; set; }
    public string accountid { get; set; }
}

public class RootObject
{
    [JsonProperty("@odata.context")]
    public string context { get; set; }
    public List<Value> value { get; set; }
}

然后反序列化 -

var value = JsonConvert.DeserializeObject<RootObject>(json);

答案 1 :(得分:0)

我们可以基于此解析并创建Anonymous Type。在您的情况下,将Anonymous Type替换为Account对象。

给定JSON字符串:

string json = @"{
   '@odata.context':'https://APIURL/api/data/v8.1/$metadata#account(accountnumber)',
   'value':[
      {
         '@odata.etag':'W/\'12496866\'',
         'accountnumber':'D00208',
         'accountid':'30417c0f-7b8c-e611-80f3-5065f38bd4d1'
      }
   ]
}";

可以解析如下:

var jsonObject = JObject.Parse(json);
var dataObject = new
{
    Context = jsonObject["@odata.context"],
    Values = jsonObject["value"].AsEnumerable<JToken>()
                                .Select(v => new
                                {
                                    ETag = v["@odata.etag"],
                                    AccountNumber = v["accountnumber"],
                                    AccountId = v["accountid"]
                                }).ToArray()
};

为了转换为Account对象,其中对象定义如下:

public class Account
{
    public string Number { get; set; }
    public string Id { get; set; }
}

然后可以解析JSON对象如下(如果只查找第一个节点;它也可以转换为Account的列表:

var jsonObject = JObject.Parse(json);
var account = jsonObject["value"].AsEnumerable<JToken>()
                                 .Select(v => new Account()
                                 {
                                     Number = v["accountnumber"].ToString(),
                                     Id = v["accountid"].ToString()
                                 }).FirstOrDefault();

答案 2 :(得分:0)

您可以使用通用类对json Web响应进行反序列化来概括接受的答案:

     class RootObject<T>
     {
        public List<T> Value { get; set; }
     }

     var odata  = JsonConvert.DeserializeObject<RootObject<POCO>>(json);

Try it with live Demo