0

I have a JSON response from an API with a number of data. What I actually need is just a few of the items in the result. Is there a way I can deserialize it to a C# object without having to define a class with members to correspond with all the items in the returned JSON. Or, must I have to define a class that has properties to correspond to all the member elements in the returned JSON?

This is a sample of the returned 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":"[email protected]","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":[]}}

I have tried the following code

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

            }
        }

but all the elements in paymentVerificationResponse including chargemessage are all null or 0

My application is running on ASP.Net-Core 3.1

9
  • You can enumerate an object properties an parse required Commented Jan 5, 2020 at 18:25
  • better you have create c# class and deserialize it Commented Jan 5, 2020 at 18:26
  • @PavelAnikhouski, Please could you guide me on how to do that? Commented Jan 5, 2020 at 18:27
  • 1
    @MahdiAnjam: That's not always the case. Sometimes you really want to be to parse JSON dynamically. Commented Jan 5, 2020 at 18:49
  • 1
    @MahdiAnjam: In many cases, yes, but not every case. At the very least, it would be worth accepting that there are such cases, even if you might want to say that usually it's worth creating a class. Commented Jan 5, 2020 at 18:59

3 Answers 3

2

You don't need to have a class that corresponds to all properties in Json, you can create a class only with needed properties and deserialize it.

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

var result = JsonConvert.DeserializeObject<Result>(json);
Sign up to request clarification or add additional context in comments.

2 Comments

Are you saying that I can now possibly get result.Message after that ? I asked this question because I just tried to do that but I am not getting a response
@Josh exactly, make sure you don't have any unescaped characters, it should work perfectly fine.
1

Parse the json string using:

var json = JObject.Parse("JsonString");

Then you can access each key using var status = (StatusEnum)json["yourKey"]

Or if you are not sure if the key will always be present you can check by using

json.ContainsKey("yourKey")

or you can try parsing it right away

if (json.TryGetValue("yourKey", out var yourKey))
{
   //property found
   var yourProperty = (YourType)yourKey;
}
else
{ 
   //doesn't contain the property
}

or even by using

if (json["yourKey"] != null)
{
   //property found
}

Hope this helps.

Comments

0

The api response is a nested object. You have some options. You can use object and access to a key using Reflection. for example for chargemessage:

var deserializedObject = JsonConvert.DeserializeObject<object>(json);
var data = deserializedObject.GetType().GetProperty("data").GetValue(deserializedObject);
var chargemessage = data.GetType().GetProperty("chargemessage").GetValue(data);

Another option is defining a class with the keys that you need and deserializing the JSON using with.

public class MyClass
{
    public DataClass data { get; set;}
}
public class DataClass
{
    public string chargemessage { get; set;}
}

after deserializing you can access the values like this:

var deserializedObject = JsonConvert.DeserializeObject<MyClass>(json);
var status = deserializedObject.data.chargemessage;

2 Comments

Please see my updated question showing where i tried to do as you are suggesting but I am getting null for the elements of the deserialized object. Please see if there is something I am not getting right there
It's because your JSON has is a nested object. Therefore you must define a class and as a result you will have: paymentVerificationResponse.data.chargemessage. I will update my answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.