C#: невозможно получить дочернее значение из строки JSON - PullRequest
0 голосов
/ 11 июля 2020

Я работаю с. net ядром. Я ударил сторонний вызов API с помощью контроллера. Я получаю ответ на звонок. И response.Content выглядит примерно так, как показано ниже.

"{\"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}\"}"

Теперь я хочу получить значения, например, TransactionID, TransactionType и Channel et c. Как мне получить эти значения в C# (. net Core)?

Для справки: Код способа вызова стороннего API.

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)

Ответы [ 5 ]

0 голосов
/ 11 июля 2020

Нет TransctionID, но тип трансакции есть

 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 голосов
/ 11 июля 2020

Вы можете проанализировать ответ, используя JObject и JArray. Вам необходимо включить пакет Newtonsoft.Json в проект.

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

См. Код -> https://dotnetfiddle.net/wSjJYr

При желании вы можете создать Concreate Class и сделать.

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

См. Код -> https://dotnetfiddle.net/tU5NI0

0 голосов
/ 11 июля 2020

позволяет сказать, что вы знаете все о вызовах API и получении строкового ответа.

например, вы получили это тело ответа от вашего вызова.

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

мы хотим получить объект, который имеет "someId" = 3! мы можем подойти к ответу несколькими способами: сначала вы можете создать класс с тем же logi c, что и тело ответа, а затем преобразовать нашу строку json в объект класса с помощью Newtonsoft. Json .JsonConvert, следующий способ - создать класс JObject и перейти в ответ. для второго способа пример выглядит следующим образом:

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

теперь o - объект из класса JObject. таким образом вам не нужно объявлять класс для вашего responseBody, но из чистого кода это не лучшая практика

0 голосов
/ 11 июля 2020

вы можете использовать онлайн-инструменты, такие как https://json2csharp.com, чтобы преобразовать ваш json объект в C# класс и создать из него модель данных, а затем использовать Newtonsoft.Json для десериализации json в c# объект

0 голосов
/ 11 июля 2020

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

Install-Package Newtonsoft.Json

или сделать tnet cli:

dotnet add package Newtonsoft.Json

наконец используйте класс JsonConvert и получите значение:

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

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

string name = m.Name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...