0
votes

C #: impossible d'obtenir la valeur enfant de la chaîne JSON

Je travaille avec .net core. J'ai frappé un appel d'API tiers avec un contrôleur. Je reçois une réponse de l'appel. Et la réponse Le contenu est quelque chose comme ci-dessous.

var client = new RestClient("third-party-api-link-here");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddParameter("application/json",
            "{\r\n\"TransactionReportDTO\":\r\n{\r\n\"PageSize\":\"15\",\r\n\"PageIndex\":\"1\",\r\n\"TransactionType\":\"Authorization\",\r\n\"Channel\": \"POS\",\r\n\"MerchantName\" :\"NEW POS TEST MERCHANT\",\r\n\"TransactionAmount\" :999.9900,\r\n\"TotalAmount\":999.9900,\r\n\"MID\" :\"999222222222222\",\r\n\"TID\": \"99922236\",\r\n\"InvoiceNumber\":\"4\",\r\n\"RRN\": \"202007091436\",\r\n\"CardNumber\":\"2205600050000476\",\r\n\"TransactionStartDate\":\"2020-07-09\",\r\n\"TransactionEndDate\":\"2020-07-09\"\r\n}\r\n\r\n}"
           , ParameterType.RequestBody);
IRestResponse response = client.Execute(request)

Maintenant, je veux obtenir des valeurs de, par exemple, TransactionID, TransactionType et Channel, etc. Comment pourrais-je obtenir ces valeurs en C # (.net Core)?

Pour référence: Code de la façon dont j'appelle une API tierce.

"{\"GetAlertingTransactionsResult\":\"{\\\"Success\\\":true,\\\"Data\\\":[{\\\"RowNum\\\":\\\"1\\\",\\\"TransactionID\\\":\\\"611\\\",\\\"TransactionType\\\":\\\"Authorization\\\",\\\"Channel\\\":\\\"POS\\\",\\\"TxnStatusDescription\\\":\\\"Processed\\\",\\\"ErrorCode\\\":\\\"0000\\\",\\\"MID\\\":\\\"999222222222222\\\",\\\"TID\\\":\\\"99922236\\\",\\\"MerchantName\\\":\\\"NEW POS TEST MERCHANT\\\",\\\"MerchantAddress\\\":\\\"TEST ADDRESS LINE1 TEST ADDRESS LINE2\\\",\\\"TransactionAmount\\\":\\\"999.9900\\\",\\\"TipAmount\\\":\\\"0.0000\\\",\\\"DiscountAmount\\\":\\\"0.0000\\\",\\\"TotalAmount\\\":\\\"999.9900\\\",\\\"ApplicationVersion\\\":\\\"V6.0.0\\\",\\\"ApplicationID\\\":\\\"A0000007362010\\\",\\\"TxnDateTime\\\":\\\"7\\/9\\/2020 2:36:07 PM\\\",\\\"RequestDateTime\\\":\\\"7\\/9\\/2020 2:36:59 PM\\\",\\\"ResponseDateTime\\\":\\\"7\\/9\\/2020 2:36:59 PM\\\",\\\"InvoiceNumber\\\":\\\"4\\\",\\\"OldInvoiceNumber\\\":\\\"0\\\",\\\"BatchNumber\\\":\\\"15\\\",\\\"AuthNumber\\\":\\\"123\\\",\\\"AssociationName\\\":\\\"PayPakCard\\\",\\\"TC\\\":\\\"123\\\",\\\"ExpiryDate\\\":\\\"123\\\",\\\"ARQC\\\":\\\"2C254884E80D7FD2\\\",\\\"CardHolderName\\\":\\\"DEBIT\\/PAYPAK              \\\",\\\"MaskedCardNumber\\\":\\\"2205 60** **** 0476\\\",\\\"Cardtype\\\":\\\"CHIP\\\",\\\"TSI\\\":\\\"6800\\\",\\\"TVR\\\":\\\"123\\\",\\\"AppLabel\\\":\\\"PayPak Debit\\\",\\\"TotalTxnCount\\\":\\\"0\\\",\\\"TerminalSerialNumber\\\":\\\"82683858\\\",\\\"CompositeKey\\\":\\\"123\\\",\\\"PINCaptureCode\\\":\\\"1\\\",\\\"IsReprint\\\":\\\"0\\\",\\\"CustomerMobileNo\\\":null,\\\"IPAddress\\\":\\\"43.245.8.61\\\",\\\"RRN\\\":\\\"123\\\"}],\\\"TotalNumberOfRecords\\\":1}\"}"


3 commentaires

stackoverflow.com/questions/56469046/...


Est-ce que cela répond à votre question? Désérialiser JSON en objet dynamique C #?


Non, ça ne marche pas pour moi. Avez-vous une autre suggestion?


5 Réponses :


0
votes

Vous pouvez utiliser un package tiers tel que Newtonsoft.Json et l'ajouter aux références de projet en:

string json = @"{
  'Name': 'Bad Boys',
  'ReleaseDate': '1995-4-7T00:00:00',
  'Genres': [
    'Action',
    'Comedy'
  ]
}";

Movie m = JsonConvert.DeserializeObject<Movie>(json);

string name = m.Name;

ou dotnet cli:

dotnet add package Newtonsoft.Json

enfin, utilisez la classe JsonConvert et obtenez la valeur:

Install-Package Newtonsoft.Json


5 commentaires

Monsieur ça donne des valeurs nulles


Qu'est-ce qui vous donne exactement la valeur nulle? DeserializeObject est une fonction générique qui tente de désérialiser votre contenu json en modèle ac # (avec des accessoires publics), si elle renvoie null, elle ne peut pas désérialiser votre contenu.


Je n'ai pas de classe / modèle comme vous l'avez mentionné "Movie". Je veux juste extraire les valeurs de TransactionId et TransactionType et les stocker dans une troisième variable. C'est tout ce que je veux faire.


Le code ci-dessus n'est qu'un exemple, ce n'est pas votre solution complète, vous devez créer une classe pour votre modèle (TransactionModel) et créer des propriétés publiques comme le résultat, par exemple: public int TransactionId {get; set;} public int TransactionType {get; set;} puis essayez de désérialiser la réponse au modèle: var model = JsonConvert.DeserializeObject <TransactionModel> (json);


J'ai créé une classe avec des propriétés telles que la chaîne publique TransactionType {get; set;} et ainsi de suite et exécutez ce qui suit, mais il donne toujours une valeur nulle sur m.TransactionType TransactionReportDTO m = JsonConvert.DeserializeObject <TransactionReportDTO> (fakeResp‌ onse); chaîne TransactionType = m.TransactionType;



0
votes

vous permet de tout savoir sur les appels API et l'obtention de la réponse de chaîne.

par exemple, vous avez obtenu ce corps de réponse de votre appel.

var responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject> 
                   (responseBody)
var o = (responseObject["someArray"] as JArray).FirstOrDefault(o=>Convert.ToInt16(o["someId"].toString()) == 3)

nous voulons récupérer l'objet qui a "someId" = 3! nous pouvons aborder la réponse avec plusieurs méthodes, vous pouvez d'abord créer une classe avec la même logique que notre corps de réponse, puis convertir notre chaîne json en objet d'une classe à l'aide de Newtonsoft.Json.JsonConvert, la méthode suivante consiste à créer un JObject classe et déplacez-vous dans la réponse. pour la deuxième façon, l'exemple est comme ci-dessous:

var responseBody="{
                   "userId": 1,
                   "id": 1,
                   "title": "delectus aut autem",
                   "someArray": [{"someId":3}]
                  }"

maintenant o est un objet de la classe JObject. de cette façon, vous n'avez pas besoin de déclarer une classe pour votre responseBody, mais à partir d'une vue de code propre n'est pas la meilleure pratique


0 commentaires

0
votes

vous pouvez utiliser des outils en ligne tels que https://json2csharp.com pour convertir votre objet json en classe C # et en créer un modèle de données, puis utiliser Newtonsoft.Json pour désérialiser json en objet c #


0 commentaires

0
votes

Vous pouvez analyser la réponse en utilisant JObject et JArray . Vous devez inclure le package Newtonsoft.Json dans le projet.

public class Root    
{
    public string GetAlertingTransactionsResult { get; set; } 
    private SubRoot _getTransactionsResult;
    public SubRoot TransactionsResult { get =>  _getTransactionsResult ??= JsonConvert.DeserializeObject<SubRoot>(GetAlertingTransactionsResult); } 
}

public class SubRoot 
{
    public bool Success { get; set; } 
    public List<Datum> Data { get; set; } 
    public int TotalNumberOfRecords { get; set; } 
}

public class Datum    
{
    public string TransactionID { get; set; } 
}

var rObject = JsonConvert.DeserializeObject<Root>(responseString);  
var tId = rObject.TransactionsResult.Data.First().TransactionID);

Voir le code -> https://dotnetfiddle.net/wSjJYr

En option, vous pouvez créer une classe concrète et faire.

var jObject = JObject.Parse(responseString)["GetAlertingTransactionsResult"];
var jDataObject = JObject.Parse(jObject.ToString());
var objectArray = JArray.Parse(jDataObject["Data"].ToString());
Console.WriteLine(objectArray[0]["TransactionID"].ToString());

Voir code -> https://dotnetfiddle.net/tU5NI0


1 commentaires

Merci! La méthode ci-dessus a fonctionné pour moi. Maintenant, je suis en mesure d'obtenir les valeurs de chacun.



0
votes

Il n'y a pas de TransctionID .Mais le type de transction est là

 string str = "{\r\n\"TransactionReportDTO\":\r\n{\r\n\"PageSize\":\"15\",\r\n\"PageIndex\":\"1\",\r\n\"TransactionType\":\"Authorization\",\r\n\"Channel\": \"POS\",\r\n\"MerchantName\" :\"NEW POS TEST MERCHANT\",\r\n\"TransactionAmount\" :999.9900,\r\n\"TotalAmount\":999.9900,\r\n\"MID\" :\"999222222222222\",\r\n\"TID\": \"99922236\",\r\n\"InvoiceNumber\":\"4\",\r\n\"RRN\": \"202007091436\",\r\n\"CardNumber\":\"2205600050000476\",\r\n\"TransactionStartDate\":\"2020-07-09\",\r\n\"TransactionEndDate\":\"2020-07-09\"\r\n}\r\n\r\n}";
            var jObject = JObject.Parse(str);

            string ttype = (string)jObject["TransactionReportDTO"]["TransactionType"];


0 commentaires