使用REGEX解析JSON请求

时间:2019-04-27 13:57:16

标签: json regex

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

的JSON输出

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

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

以下是苹果的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没有逗号,需要加以说明。

1 个答案:

答案 0 :(得分:-1)

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

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

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

然后,可以将 \ n} 边界用作最后一个值,将“” 边界用作字符串值,而没有边界用于数字值。

enter image description here