Десериализация строки JSON в непредопределенный объект в C# - PullRequest
0 голосов
/ 05 января 2020

У меня есть JSON ответ от API с несколькими данными. Что мне действительно нужно, так это всего лишь несколько пунктов в результате. Есть ли способ, которым я могу десериализовать его в C# объект без необходимости определять класс с членами, чтобы соответствовать всем элементам в возвращенном JSON. Или я должен определить класс, свойства которого должны соответствовать всем элементам-членам в возвращенном 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, включая обвинение, все равны нулю или 0

Мое приложение работает на ASP. Net -Core 3.1

Ответы [ 3 ]

2 голосов
/ 05 января 2020

Вам не нужно иметь класс, который соответствует всем свойствам в Json, вы можете создать класс только с необходимыми свойствами и десериализовать его.

public class Result
{
    public string Status { get; set;}
    public string Message { get; set;}
}

var result = JsonConvert.DeserializeObject<Result>(json);
1 голос
/ 05 января 2020

Разобрать строку 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
}

Надеюсь, это поможет.

0 голосов
/ 05 января 2020

Ответ 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);

Другой вариант - определить класс с нужными вам ключами и десериализовать 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;
...