如何将具有 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
对象可以解析如下(如果只查找第一个节点;也可以转换为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();
您可以通过使用通用 class 反序列化 json 网络响应来概括已接受的答案:
class RootObject<T>
{
public List<T> Value { get; set; }
}
var odata = JsonConvert.DeserializeObject<RootObject<POCO>>(json);
我正在从连接到 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
对象可以解析如下(如果只查找第一个节点;也可以转换为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();
您可以通过使用通用 class 反序列化 json 网络响应来概括已接受的答案:
class RootObject<T>
{
public List<T> Value { get; set; }
}
var odata = JsonConvert.DeserializeObject<RootObject<POCO>>(json);