解析Python JSON(Oanda V20)

时间:2017-05-26 02:36:24

标签: python json parsing

初学者Python编码器,这个问题对我来说似乎很简单,但我花了好几个小时试图解决这个问题。

我正在尝试解析以下JSON以简单地检索' time'和'出价/价格'

{
"prices": [
    {
        "type": "PRICE",
        "time": "2017-05-26T02:21:25.603280035Z",
        "bids": [
            {
                "price": "1.34939",
                "liquidity": 10000000
            }
        ],
        "asks": [
            {
                "price": "1.34956",
                "liquidity": 10000000
            }
        ],
        "closeoutBid": "1.34939",
        "closeoutAsk": "1.34956",
        "status": "tradeable",
        "tradeable": true,
        "unitsAvailable": {
            "default": {
                "long": "33",
                "short": "33"
            },
            "openOnly": {
                "long": "33",
                "short": "33"
            },
            "reduceFirst": {
                "long": "33",
                "short": "33"
            },
            "reduceOnly": {
                "long": "0",
                "short": "0"
            }
        },
        "quoteHomeConversionFactors": {
            "positiveUnits": "1.00000000",
            "negativeUnits": "1.00000000"
        },
        "instrument": "USD_CAD"
    }
]

}

我使用了多种代码变体而没有结果。 这是我的最新消息:

import json
import pandas as pd
import oandapyV20
from oandapyV20 import API
import oandapyV20.endpoints.pricing as pricing
import logging
from datetime import datetime

logging.basicConfig(filename="v20.log", level=logging.INFO, format='%
(asctime)s [%(levelname)s] %(name)s : %(message)s',)

accountID = 
access_token = 
api = API(access_token = access_token, environment = "live")

params = {"instruments": "USD_CAD"}

r= pricing.PricingInfo(accountID=accountID,params=params)
rv = api.request(r)
json_str = json.dumps(rv, indent=4)
new_json_str = json_str(["prices"])
print(new_json_str)

我收到以下错误:TypeError:' str'对象不可调用

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:0)

好的,看起来price对象就是一个对象列表。

所以你必须这样做

jsonVar["prices"][0]["time"]
jsonVar["prices"][0]["bids"]["price"]

如果有多个价格退回,您可以获得以下所有信息:

for each priceObject in jsonVar["prices"]:
    print priceObject["time"]
    print priceObject["bids"]["price"]

答案 1 :(得分:0)

json.dumps接受一个python对象并将其序列化为有效json格式的字符串(即,它不再是可以再使用的对象,它是一个字符串)。看看你目前在代码中做了什么,看起来rv已经是你的第一个代码片段中给出的结构中的python对象了?

如果rv是一个python对象,那么你可以直接使用它来获取值,而不必担心json。例如:rv['prices'][0]['time']来检索给定结构的时间。

但是,如果api返回格式为json的字符串,则rv将是一个字符串,必须首先解析为json。例如:

json_data = json.loads(rv)
time = json_data['prices'][0]['time']

为了帮助调试,请尝试打印type(rv)以查看它是字符串还是python字典。