将 JSON 字符串反序列化为 C# 中的非预定义对象
Deserializing JSON string to a non-predefined object in C#
我收到来自 API 的 JSON 响应,其中包含大量数据。我真正需要的只是结果中的一些项目。
有没有一种方法可以将它反序列化为 C# 对象,而不必定义 class 的成员来对应返回的 JSON 中的所有项目。
或者,我是否必须定义一个 class,它的属性对应于返回的 JSON 中的所有成员元素?
这是返回的示例 JSON
{"status":"success","message":"Tx Fetched","data":{"txid":993106,"txref":"rgdk3viu.h","flwref":"FLW-MOCK-08efd1cb507f60ae50f7ebab4b27d234","devicefingerprint":"1d3d89c867abc0a84e1e167e2430456a","cycle":"one-time","amount":240,"currency":"NGN","chargedamount":243.36,"appfee":3.36,"merchantfee":0,"merchantbearsfee":0,"chargecode":"00","chargemessage":"Please enter the OTP sent to your mobile number 080****** and email te**@rave**.com","authmodel":"PIN","ip":"197.211.58.150","narration":"CARD Transaction ","status":"successful","vbvcode":"00","vbvmessage":"successful","authurl":"N/A","acctcode":null,"acctmessage":null,"paymenttype":"card","paymentid":"6490","fraudstatus":"ok","chargetype":"normal","createdday":0,"createddayname":"SUNDAY","createdweek":1,"createdmonth":0,"createdmonthname":"JANUARY","createdquarter":1,"createdyear":2020,"createdyearisleap":true,"createddayispublicholiday":0,"createdhour":17,"createdminute":40,"createdpmam":"pm","created":"2020-01-05T17:40:50.000Z","customerid":248784,"custphone":"080123456789","custnetworkprovider":"UNKNOWN PROVIDER","custname":"Chukwuemeka Ekeleme","custemail":"emeka.ekeleme@gmail.com","custemailprovider":"GMAIL","custcreated":"2020-01-05T17:40:50.000Z","accountid":85976,"acctbusinessname":"Learning Suite Nigeria","acctcontactperson":"Joshua Ndukwe","acctcountry":"NG","acctbearsfeeattransactiontime":0,"acctparent":1,"acctvpcmerchant":"N/A","acctalias":null,"acctisliveapproved":0,"orderref":"URF_1578246050675_7111835","paymentplan":null,"paymentpage":null,"raveref":"RV31578246049488BB4A178915","amountsettledforthistransaction":240,"card":{"expirymonth":"09","expiryyear":"22","cardBIN":"553188","last4digits":"2950","brand":" CREDIT","issuing_country":"NIGERIA NG","card_tokens":[{"embedtoken":"flw-t1nf-4542d3a9e7155f1512344b02aaa46255-m03k","shortcode":"534fb","expiry":"9999999999999"}],"type":"MASTERCARD","life_time_token":"flw-t1nf-4542d3a9e7155f1512344b02aaa46255-m03k"},"meta":[]}}
我试过下面的代码
using (var httpClient = new HttpClient())
{
StringContent content = new StringContent(JsonConvert.SerializeObject(paymentVerificationRequestData), Encoding.UTF8, "application/json");
using (var response = await httpClient.PostAsync(paymentVerificationRequestData.Url, content))
{
string apiResponse = await response.Content.ReadAsStringAsync();
var paymentVerificationResponse = JsonConvert.DeserializeObject<RaveVerificationResponseData>(apiResponse);
string msg = paymentVerificationResponse.chargemessage;
return Content(msg);
}
}
但是paymentVerificationResponse中的所有元素包括chargemessage都是null或者0
我的应用程序 运行 ASP.Net-Core 3.1
api 响应是嵌套对象。你有一些选择。您可以使用 object
并使用 Reflection
访问密钥。例如 chargemessage
:
var deserializedObject = JsonConvert.DeserializeObject<object>(json);
var data = deserializedObject.GetType().GetProperty("data").GetValue(deserializedObject);
var chargemessage = data.GetType().GetProperty("chargemessage").GetValue(data);
另一种选择是使用您需要的键定义 class 并使用 with.
反序列化 JSON
public class MyClass
{
public DataClass data { get; set;}
}
public class DataClass
{
public string chargemessage { get; set;}
}
反序列化后,您可以像这样访问值:
var deserializedObject = JsonConvert.DeserializeObject<MyClass>(json);
var status = deserializedObject.data.chargemessage;
你不需要有一个class对应所有属性在Json,你可以只创建一个class具有所需的属性并将其反序列化。
public class Result
{
public string Status { get; set;}
public string Message { get; set;}
}
var result = JsonConvert.DeserializeObject<Result>(json);
使用以下方法解析 json 字符串:
var json = JObject.Parse("JsonString");
然后您可以使用 var status = (StatusEnum)json["yourKey"]
访问每个密钥
或者,如果您不确定密钥是否始终存在,您可以使用
进行检查
json.ContainsKey("yourKey")
或者您可以立即尝试解析它
if (json.TryGetValue("yourKey", out var yourKey))
{
//property found
var yourProperty = (YourType)yourKey;
}
else
{
//doesn't contain the property
}
甚至使用
if (json["yourKey"] != null)
{
//property found
}
希望这对您有所帮助。
我收到来自 API 的 JSON 响应,其中包含大量数据。我真正需要的只是结果中的一些项目。 有没有一种方法可以将它反序列化为 C# 对象,而不必定义 class 的成员来对应返回的 JSON 中的所有项目。 或者,我是否必须定义一个 class,它的属性对应于返回的 JSON 中的所有成员元素?
这是返回的示例 JSON
{"status":"success","message":"Tx Fetched","data":{"txid":993106,"txref":"rgdk3viu.h","flwref":"FLW-MOCK-08efd1cb507f60ae50f7ebab4b27d234","devicefingerprint":"1d3d89c867abc0a84e1e167e2430456a","cycle":"one-time","amount":240,"currency":"NGN","chargedamount":243.36,"appfee":3.36,"merchantfee":0,"merchantbearsfee":0,"chargecode":"00","chargemessage":"Please enter the OTP sent to your mobile number 080****** and email te**@rave**.com","authmodel":"PIN","ip":"197.211.58.150","narration":"CARD Transaction ","status":"successful","vbvcode":"00","vbvmessage":"successful","authurl":"N/A","acctcode":null,"acctmessage":null,"paymenttype":"card","paymentid":"6490","fraudstatus":"ok","chargetype":"normal","createdday":0,"createddayname":"SUNDAY","createdweek":1,"createdmonth":0,"createdmonthname":"JANUARY","createdquarter":1,"createdyear":2020,"createdyearisleap":true,"createddayispublicholiday":0,"createdhour":17,"createdminute":40,"createdpmam":"pm","created":"2020-01-05T17:40:50.000Z","customerid":248784,"custphone":"080123456789","custnetworkprovider":"UNKNOWN PROVIDER","custname":"Chukwuemeka Ekeleme","custemail":"emeka.ekeleme@gmail.com","custemailprovider":"GMAIL","custcreated":"2020-01-05T17:40:50.000Z","accountid":85976,"acctbusinessname":"Learning Suite Nigeria","acctcontactperson":"Joshua Ndukwe","acctcountry":"NG","acctbearsfeeattransactiontime":0,"acctparent":1,"acctvpcmerchant":"N/A","acctalias":null,"acctisliveapproved":0,"orderref":"URF_1578246050675_7111835","paymentplan":null,"paymentpage":null,"raveref":"RV31578246049488BB4A178915","amountsettledforthistransaction":240,"card":{"expirymonth":"09","expiryyear":"22","cardBIN":"553188","last4digits":"2950","brand":" CREDIT","issuing_country":"NIGERIA NG","card_tokens":[{"embedtoken":"flw-t1nf-4542d3a9e7155f1512344b02aaa46255-m03k","shortcode":"534fb","expiry":"9999999999999"}],"type":"MASTERCARD","life_time_token":"flw-t1nf-4542d3a9e7155f1512344b02aaa46255-m03k"},"meta":[]}}
我试过下面的代码
using (var httpClient = new HttpClient())
{
StringContent content = new StringContent(JsonConvert.SerializeObject(paymentVerificationRequestData), Encoding.UTF8, "application/json");
using (var response = await httpClient.PostAsync(paymentVerificationRequestData.Url, content))
{
string apiResponse = await response.Content.ReadAsStringAsync();
var paymentVerificationResponse = JsonConvert.DeserializeObject<RaveVerificationResponseData>(apiResponse);
string msg = paymentVerificationResponse.chargemessage;
return Content(msg);
}
}
但是paymentVerificationResponse中的所有元素包括chargemessage都是null或者0
我的应用程序 运行 ASP.Net-Core 3.1
api 响应是嵌套对象。你有一些选择。您可以使用 object
并使用 Reflection
访问密钥。例如 chargemessage
:
var deserializedObject = JsonConvert.DeserializeObject<object>(json);
var data = deserializedObject.GetType().GetProperty("data").GetValue(deserializedObject);
var chargemessage = data.GetType().GetProperty("chargemessage").GetValue(data);
另一种选择是使用您需要的键定义 class 并使用 with.
反序列化 JSONpublic class MyClass
{
public DataClass data { get; set;}
}
public class DataClass
{
public string chargemessage { get; set;}
}
反序列化后,您可以像这样访问值:
var deserializedObject = JsonConvert.DeserializeObject<MyClass>(json);
var status = deserializedObject.data.chargemessage;
你不需要有一个class对应所有属性在Json,你可以只创建一个class具有所需的属性并将其反序列化。
public class Result
{
public string Status { get; set;}
public string Message { get; set;}
}
var result = JsonConvert.DeserializeObject<Result>(json);
使用以下方法解析 json 字符串:
var json = JObject.Parse("JsonString");
然后您可以使用 var status = (StatusEnum)json["yourKey"]
或者,如果您不确定密钥是否始终存在,您可以使用
进行检查json.ContainsKey("yourKey")
或者您可以立即尝试解析它
if (json.TryGetValue("yourKey", out var yourKey))
{
//property found
var yourProperty = (YourType)yourKey;
}
else
{
//doesn't contain the property
}
甚至使用
if (json["yourKey"] != null)
{
//property found
}
希望这对您有所帮助。