python - 将带有浮点数的json字符串解析为python中的字符串
问题描述
我正在编写一个使用 python 请求从 URL 读取 json 的类对象。json 字符串很奇怪,因为浮点数、日期和整数都是字符串。
{
"financialStatementList" : [ {
"symbol" : "HUBS",
"financials" : [ {
"date" : "2018-12-31",
"Revenue" : "512980000.0",
"Revenue Growth" : "0.3657",
"Cost of Revenue" : "100357000.0",
"Gross Profit" : "412623000.0",
"R&D Expenses" : "117603000.0",
"SG&A Expense" : "343278000.0",
"Operating Expenses" : "460881000.0",
"Operating Income" : "-48258000.0",
"Interest Expense" : "21386000.0",
"Earnings before Tax" : "-61960000.0",
"Income Tax Expense" : "1868000.0",
"Net Income - Non-Controlling int" : "0.0",
"Net Income - Discontinued ops" : "0.0",
"Net Income" : "-63828000.0",
"Preferred Dividends" : "0.0",
"Net Income Com" : "-63828000.0",
"EPS" : "-1.66",
"EPS Diluted" : "-1.66",
"Weighted Average Shs Out" : "39232269.0",
"Weighted Average Shs Out (Dil)" : "38529000.0",
"Dividend per Share" : "0.0",
"Gross Margin" : "0.8044",
"EBITDA Margin" : "-0.033",
"EBIT Margin" : "-0.0791",
"Profit Margin" : "-0.124",
"Free Cash Flow margin" : "0.1002",
"EBITDA" : "-17146000.0",
"EBIT" : "-40574000.0",
"Consolidated Income" : "-63828000.0",
"Earnings Before Tax Margin" : "-0.1208",
"Net Profit Margin" : "-0.1244"
}
api端点的json示例如下: financialmodelingprep.com
我的问题是,当我对此进行解码时,我最终得到的是对象/字符串,而不是浮点数或整数。
我试过了:
r = requests.get(url, params)
jd = json.loads(r.text)
也:
r = requests.get(url, params)
jd - r.json()
并且,还有使用 kwargs 的变体,例如 parse_float = float 或 parse_float=Decimal
我的最终目标是使用浮点数、整数和日期将其转换为格式。
解决方案
我最终需要为我的 json 解码器编写一个自定义对象挂钩。
我还决定添加一个camelizer来缩短键。
import requests
import re
import json
from datetime import datetime
quarterdateformat = '%Y-%m-%d'
def camelize(string):
return "".join(string.split(" "))
def convert_types(d):
for k, v in d.items():
#print(k, type(v))
new_v = v
if type(v) is str:
#match for float
if re.match('[-+]?[0-9]*\.[0-9]+', v):
new_v = float(v)
#match for date
if re.match('([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))', v):
new_v = datetime.strptime(v, quarterdateformat).date()
d[k] = new_v
d = {camelize(k): v for k, v in d.items()}
return d
url = "https://financialmodelingprep.com/api/v3/financials/income-statement/CRM,HUBS"
params = {'datatyupe' : 'json'}
r = requests.get(url, params)
jd= json.loads(r.text, object_hook=convert_types)
convert_types 是对象挂钩函数,它使用正则表达式来查找浮点数和日期并转换它们。Camelizer 用于在对象挂钩的末尾将所有键转换为 CamelCase。
推荐阅读
- phonegap-plugins - launchnavigator 插件构建在 phonegap buid 中出错
- javascript - 如何根据一天中的实时旋转 360° 昼夜循环图像?
- ms-access - Microsoft Access 字段添加 1
- wpf - 动态大小的工具提示的正确 XAML 是什么?
- python - 获取 groupby 多列的结果并直接在我的数据框中计数
- java - 哪些容器提供者支持 org.apache.cxf.jaxrs.JAXRSServerFactoryBean?
- windows - 使用 Powershell 解析事件日志 (ID 4725) 和输出目标用户名字段时出现问题
- c++ - 为白名单类型约束模板功能的更好方法,SFINAE?
- c++ - 关于在函数执行后如何使用和获取 return 值的问题
- node.js - 无法上传图片文件