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

本文关键字:转换 HttpResponseMessage 对象 OData | 更新日期: 2023-09-27 18:12:55

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

response.Content.ReadAsStringAsync().Result

上面的语句返回如下输出。我需要将其转换为Account对象,该对象已经具有"accountnumber"answers"accountid"属性。

{
"@odata.context":"https://APIURL/api/data/v8.1/元数据#美元账户(accountnumber)","价值":({"@odata.etag":"W"/' 12496866 '","accountnumber":"D00208"、"accountid":"30417 c0f - 7 - b8c e611 - 80 - f3 - 5065 - f38bd4d1"}]}

我已经尝试了以下代码

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

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

知道如何正确地将此响应转换为c#类型吗?

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

你应该这样做-

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

我们可以基于此解析并创建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 s列表:

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

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

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

用live Demo试试