首页 > 解决方案 > 使用正则表达式解析 JSON 请求

问题描述

我想解析来自 IEX Cloud 股票报价查询的 JSON 输出:https ://cloud.iexapis.com/stable/stock/aapl/quote?token=YOUR_TOKEN_HERE

我已经厌倦了使用 Regex101 来解决问题: https ://regex101.com/r/y8i01T/1/

这是我尝试过的正则表达式:"([^"]+)":"?([^",\s]+)

以下是 Apple 的 IEX Cloud 股票报价输出示例:

{
     "symbol":"AAPL", 
     "companyName":"Apple, Inc.", 
     "calculationPrice":"close", 
     "open":204.86, 
     "openTime":1556285400914, 
     "close":204.3, 
     "closeTime":1556308800303, 
     "high":205, 
     "low":202.12, 
     "latestPrice":204.3, 
     "latestSource":"Close", 
     "latestTime":"April 26, 2019", 
     "latestUpdate":1556308800303, 
     "latestVolume":18604306, 
     "iexRealtimePrice":204.34, 
     "iexRealtimeSize":48, 
     "iexLastUpdated":1556308799763, 
     "delayedPrice":204.3, 
     "delayedPriceTime":1556308800303, 
     "extendedPrice":204.46, 
     "extendedChange":0.16, 
     "extendedChangePercent":0.00078, 
     "extendedPriceTime":1556310657637, 
     "previousClose":205.28, 
     "change":-0.98, 
     "changePercent":-0.00477, 
     "iexMarketPercent":0.030716437366704246, 
     "iexVolume":571458, 
     "avgTotalVolume":27717780, 
     "iexBidPrice":0, 
     "iexBidSize":0, 
     "iexAskPrice":0, 
     "iexAskSize":0, 
     "marketCap":963331704000, 
     "peRatio":16.65, 
     "week52High":233.47, 
     "week52Low":142, 
     "ytdChange":0.29512900000000003 
}

我想将键值对保存在 JSON 响应中,而不用在键周围加上引号,并收集从冒号 (:) 开始的值。我需要排除文本的任何引号,每行末尾的逗号,并包括最后一个在行尾不包含逗号的键值对。

例如,"peRatio":16.65,应该有键等于peRatio和值等于16.65。或者另一个例子,"changePercent":-0.00477,应该有一个等于changePercent和一个值的键-0.00477。如果它是一个文本,例如"companyName":"Apple, Inc.",,它应该有一个等于的键 companyName和一个等于的值Apple, Inc.

此外,最后一个 JSON 键值条目:"ytdChange":0.29512900000000003没有逗号,需要说明。

标签: jsonregex

解决方案


您很可能不需要使用正则表达式解析您的数据。但是,如果您希望/必须这样做,也许是为了练习正则表达式,您可以通过在表达式中定义一些边界来做到这一点。

此 RegEx可能会帮助您做到这一点,它将您的输入 JSON 值分为三类字符串、数字和最后一个无逗号值:

"([^"]+)":("(.+)"|(.+))(,{1}|\n\})

然后,您可以将\n}边界用于最后一个值,""将边界用于字符串值,而将无边界用于数值。

在此处输入图像描述


推荐阅读