【问题标题】:C#: Not able to get child value from JSON stringC#:无法从 JSON 字符串中获取子值
【发布时间】:2020-10-31 23:21:19
【问题描述】:

我正在使用 .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 等的值。 如何在 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)

【问题讨论】:

标签: c# json asp.net-mvc .net-core


【解决方案1】:

您可以使用JObjectJArray 解析响应。您需要在项目中包含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

您可以选择创建具体的类并执行。

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

【讨论】:

  • 谢谢!上述方法对我有用。现在我可以得到每个值。
【解决方案2】:

您可以使用第三方包,如 Newtonsoft.Json,并通过以下方式将其添加到项目引用中:

Install-Package Newtonsoft.Json

或 dotnet 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;

【讨论】:

  • 先生,它给出了空值
  • 究竟是什么给了你空值? DeserializeObject 是一个通用函数,它尝试将您的 json 内容反序列化为 c# 模型(带有公共道具),如果它返回 null,则无法反序列化您的内容。
  • 我没有任何类/模型,就像你提到的“电影”。我只想提取 TransactionId 和 TransactionType 的值并将其存储到第三个变量中。这就是我想做的。
  • 上面的代码只是一个例子,它不是你的完整解决方案,你应该为你的模型(TransactionModel)创建一个类,并像结果一样创建公共属性,例如:public int TransactionId {get ;集;}公共int TransactionType {get; set;} 然后尝试反序列化对模型的响应: var model = JsonConvert.DeserializeObject(json);
  • 我创建了一个具有一些属性的类,例如 public string TransactionType {get; set;} 等等并运行以下命令,但它仍然在 m.TransactionType TransactionReportDTO m = JsonConvert.DeserializeObject(fakeResponse); 上给出空值字符串 TransactionType = m.TransactionType;
【解决方案3】:

假设您了解所有关于 api 调用和获取字符串响应的知识。

例如,您从通话中获得了此响应正文。

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

我们要获取具有 "someId"=3 的对象! 我们可以通过多种方式来接近答案,首先您可以创建一个与我们的响应主体具有相同逻辑的类,然后使用 Newtonsoft.Json.JsonConvert 将我们的 json 字符串转换为类的对象,下一个方法是创建一个 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 声明一个类,但是从干净的代码视图来看并不是最佳实践

【讨论】:

    【解决方案4】:

    您可以使用https://json2csharp.com等在线工具将您的json对象转换为C#类并从中创建数据模型,然后使用Newtonsoft.Json将json反序列化为c#对象

    【讨论】:

      【解决方案5】:

      没有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"];

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        相关资源
        最近更新 更多