【问题标题】:How to convert HttpResponseMessage having OData to a C# object?如何将具有 OData 的 HttpResponseMessage 转换为 C# 对象?
【发布时间】:2017-02-22 05:30:38
【问题描述】:

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

response.Content.ReadAsStringAsync().Result

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

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

我试过下面的代码

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你应该这样做 -

    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);
    

    【讨论】:

    • 优秀的解决方案.. Live saver :)
    【解决方案2】:

    我们可以在此基础上解析和创建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对象可以解析如下(如果只查找第一个节点;也可以转换为Accounts的列表:

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

    【讨论】:

      【解决方案3】:

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

           class RootObject<T>
           {
              public List<T> Value { get; set; }
           }
      
           var odata  = JsonConvert.DeserializeObject<RootObject<POCO>>(json);
      

      Try it with live Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 2017-11-07
        • 2017-09-23
        相关资源
        最近更新 更多