【问题标题】:Convert invalid JSON (having equal sign instead of colon, no quotes etc) to valid JSON将无效 JSON(具有等号而不是冒号、无引号等)转换为有效 JSON
【发布时间】:2021-09-01 14:29:19
【问题描述】:

我正在从 Cardstream 支付网关 android sdk(在本机模块中)获取数据以做出本机反应,但数据不是有效的 JSON:

'{ __wafRequestID=2021-06-16T08:02:14Z|0e2314f32f|115.186.169.10|gk0GHP1i4V, action=SALE, addressCheckPref=not known,not checked,matched,not matched,partially matched, amount=14, amountRetained=0, avscv2CheckEnabled=Y, caEnabled=Y, cardCVVMandatory=Y, cardExpiryDate=0322, cardFlags=8323072, cardIssuer=UNKNOWN, cardIssuerCountry=United Kingdom, cardIssuerCountryCode=GBR, cardNumberMask=424242******4242, cardNumberValid=Y, cardScheme=Visa, cardSchemeCode=VC, cardType=Visa Credit, cardTypeCode=VC, cftEnabled=N, countryCode=826, currencyCode=826, currencyExponent=2, customerName=fgg, customerReceiptsRequired=Y, cv2CheckPref=not known,not checked,matched,not matched,partially matched, eReceiptsEnabled=N, merchantAlias=100001, merchantID=100001, merchantID2=100001, paymentMethod=card, postcodeCheckPref=not known,not checked,matched,not matched,partially matched, processMerchantID=100001, requestID=60c9b007225c7, requestMerchantID=100001, responseCode=65566, responseMessage=Disallowed cardnumber, responseStatus=2, riskCheckEnabled=Y, riskCheckPref=not known=continue,not checked=continue,approve=continue,decline=decline1,review=authonly,escalate=authonly, riskProcessorID=41, riskProcessorName=Kount, rtsEnabled=Y, scaExemption=lowvalue,trusted, state=finished, surchargeEnabled=Y, surchargeRequired=Y, threeDSCheckPref=authenticated, threeDSEnabled=N, timestamp=2021-06-16 09:02:16, transactionID=112446674, type=1, vcsResponseCode=0, vcsResponseMessage=Success, xref=21061609KX02TQ16YP35TTD}'

如何将其转换为有效的 JSON 以便我可以解析它?我尝试了一些正则表达式替换,但有些值也有冒号,这把它搞砸了。

【问题讨论】:

  • 这不是无效的 JSON,它根本不是 JSON。您基本上是在声称苹果是无效的橙子,因为您渴望橙子。联系支付网关并询问他们如何解析他们的废话。
  • 哈哈不,我没有声称它,只是寻找任何解决方法来解析它(不管它是什么)
  • 我认为你标题的前三个词有区别; “转换无效的 JSON”。无论如何,解决方法是联系支付网关并询问他们如何解析他们的废话。
  • 正则表达式可能不是您想要的。您确实应该联系您正在使用其 API 的公司,并要求提供有关如何解析其响应的文档。您不知道您现在处理的响应是否代表所有未来的响应,或者某些尚未看到的语法是否会完全破坏您的正则表达式。最好提前知道,然后在生产中的某个时间窗口内无法正确处理响应。

标签: javascript android json regex payment-gateway


【解决方案1】:

如果您想尝试使用正则表达式解析它,那么这可能会起作用:

[{,] (?<key>[a-zA-Z0-9_]+)=(?<value>.*?(?=, [a-zA-Z0-9_]+=|\}$))

https://regex101.com/r/Fk7NvR/1

只需遍历匹配项并访问分别名为keyvalue 的捕获组。 riskCheckPref 的值似乎很可疑,但我不知道它们的解析规则。

另一种想法是删除外部花括号,修剪空白,在, (逗号空格)上拆分,然后在第一个= 上再次拆分。

【讨论】:

  • data.replace([{,] (?P[a-zA-Z0-9_]+)=(?P.*?(?=, [a- zA-Z0-9_]+=|\}$))) 正则表达式抛出错误:Uncaught SyntaxError: Unexpected token ','
  • @artsnr 那是 Python。看到您的更新后,我将其更新为 JavaScript。另外,你为什么使用.replace()?我提出了一个提取数据的解决方案。您应该使用 .match()developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
  • @artsnr 另外,不要忘记 JS 中的正则表达式文字需要前导和尾随正斜杠,后跟全局修饰符。
【解决方案2】:

我在 android 中将响应转换为 JSON,然后将其传递给 react-native 而不是将响应传递给 react-native(以这种无效格式传递),然后敲我的头来转换它到 JSON。我的错。谢谢大家

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 2021-07-27
    • 1970-01-01
    • 2013-12-19
    • 2018-05-27
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多