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

How to convert HttpResponseMessage having OData to a C# object?

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

response.Content.ReadAsStringAsync().Result

上面的语句returns输出如下。我需要将其转换为 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# 类型。

你应该这样做 -

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对象可以解析如下(如果只查找第一个节点;也可以转换为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();

您可以通过使用通用 class 反序列化 json 网络响应来概括已接受的答案:

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

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

Try it with live Demo