【问题标题】:How to format API JSON output?如何格式化 API JSON 输出?
【发布时间】:2019-06-10 00:00:07
【问题描述】:

我最近开始研究在 Tkinter 的 python 程序中使用 API,到目前为止,我已经能够编写一个程序,使用 TransportAPI 在伦敦地铁站的旅行规划器中提取旅行数据。

到目前为止,该程序运行良好,我遇到的唯一问题是将返回的 JSON 数据格式化为用户可读的格式。下面是创建 URL 并在程序中显示输出的函数的代码,以及程序运行时的当前输出。

创建 API URL 并返回输出:

def create_url(): # creates API url using inputted / chosen values

    input_time = get_time()
    input_date = get_date()

    station_from = get_source()
    station_to = get_destination()

    search_url = 'https://transportapi.com/v3/uk/public/journey/from/'+station_from+'/to/'+station_to+'/at/'+input_date+'/'+input_time+'.json?app_id=bab9c3cc&app_key=0caef97a7e642a7d15f6f59efac6332c&modes=train&not_modes=bus-boat&service=tfl'

    return search_url

在程序窗口中显示输出:

def display_results(): # displays API result to the user
    data = get_data()
    label_search_result.config(text=data)

程序中的当前输出:

{"request_time":"2019-06-10T00:50:45+01:00","source":"TfL journey planning
API","acknowledgements":"Transport for London","routes":
[{"duration":"00:09:00","route_parts":
[{"mode":"tube","from_point_name":"Stratford","to_point_name":"Liverpool
Street","destination":"Ealing
Broadway","line_name":"Central","duration":"00:09:00","departure_time":"12:46"
,"arrival_time":"12:55","coordinates":[[-0.00336,51.54171],[-0.00427,51.54114],[-0.00474,51.54078],[-0.00561,51.54003],[-0.00758,51.53835],[-0.00955,51.53671],[-0.01158,51.53537],[-0.01786,51.53208],[-0.01984,51.53117],[-0.02096,51.53064],[-0.0214,51.53037],[-0.0253,51.52724],[-0.02583,51.52699],[-0.02626,51.52688],[-0.02806,51.52654],[-0.03209,51.52567],[-0.03299,51.52548],[-0.03354,51.52533],[-0.03354,51.52533],[-0.03509,51.52494],[-0.03592,51.5247],[-0.0374,51.52418],[-0.03905,51.52366],[-0.04055,51.52328],[-0.04125,51.52314],[-0.04253,51.52314],[-0.04328,51.52324],[-0.04472,51.5236],[-0.0457,51.52393],[-0.04659,51.52435],[-0.04945,51.52616],[-0.04996,51.52643],[-0.05064,51.52665],[-0.0516,51.52684],[-0.05459,51.52706],[-0.05459,51.52706],[-0.0568,51.52722],[-0.05741,51.52722],[-0.062,51.52673],[-0.06601,51.52627],[-0.06796,51.526],[-0.06924,51.52575],[-0.07011,51.52552],[-0.07173,51.5248],[-0.07397,51.52386],[-0.0751,51.52336],[-0.0762,51.52271],[-0.08219,51.51805]]}],"departure_time":"12:46","departure_date":"2019-07-07","arrival_time":"12:55","arrival_date":"2019-07-07"},{"duration":"00:09:00","route_parts":[{"mode":"tube","from_point_name":"Stratford","to_point_name":"Liverpool Street","destination":"West Ruislip","line_name":"Central","duration":"00:09:00","departure_time":"12:48","arrival_time":"12:57","coordinates":[[-0.00336,51.54171],[-0.00427,51.54114],[-0.00474,51.54078],[-0.00561,51.54003],[-0.00758,51.53835],[-0.00955,51.53671],[-0.01158,51.53537],[-0.01786,51.53208],[-0.01984,51.53117],[-0.02096,51.53064],[-0.0214,51.53037],[-0.0253,51.52724],[-0.02583,51.52699],[-0.02626,51.52688],[-0.02806,51.52654],[-0.03209,51.52567],[-0.03299,51.52548],[-0.03354,51.52533],[-0.03354,51.52533],[-0.03509,51.52494],[-0.03592,51.5247],[-0.0374,51.52418],[-0.03905,51.52366],[-0.04055,51.52328],[-0.04125,51.52314],[-0.04253,51.52314],[-0.04328,51.52324],[-0.04472,51.5236],[-0.0457,51.52393],[-0.04659,51.52435],[-0.04945,51.52616],[-0.04996,51.52643],[-0.05064,51.52665],[-0.0516,51.52684],[-0.05459,51.52706],[-0.05459,51.52706],[-0.0568,51.52722],[-0.05741,51.52722],[-0.062,51.52673],[-0.06601,51.52627],[-0.06796,51.526],[-0.06924,51.52575],[-0.07011,51.52552],[-0.07173,51.5248],[-0.07397,51.52386],[-0.0751,51.52336],[-0.0762,51.52271],[-0.08219,51.51805]]}],"departure_time":"12:48","departure_date":"2019-07-07","arrival_time":"12:57","arrival_date":"2019-07-07"}]}

如何将这些数据格式化为用户更易读的内容?对于一个想法,理想的输出应该是这样的:

Source: Stratford
Destination: London Liverpool Street
Route:
Line: Central
To: Ealing Broadway
Duration: 09:00
Departure Time: 12:46
Arrival Time: 12:55

Source: Stratford
Destination: London Liverpool Street
Route:
Line: Central
To: West Ruslip
Duration: 09:00
Departure Time: 12:48
Arrival Time: 12:57

【问题讨论】:

  • Json 在 python 中被解析为字典。假设密钥没有改变,您可以将密钥解析为您想要的格式

标签: python json python-2.7 tkinter


【解决方案1】:

原始 JSON 数据的格式如下所示,因此更具可读性,您可以更清楚地看到其结构 — 这在执行此类操作时通常很有帮助:

{"acknowledgements": "Transport for London",
 "request_time": "2019-06-10T00:50:45+01:00",
 "routes": [{"arrival_date": "2019-07-07",
             "arrival_time": "12:55",
             "departure_date": "2019-07-07",
             "departure_time": "12:46",
             "duration": "00:09:00",
             "route_parts": [{"arrival_time": "12:55",
                              "coordinates": [[-0.00336, 51.54171],
                                               .
                                               .
                                               .
                                              [-0.08219, 51.51805]],
                              "departure_time": "12:46",
                              "destination": "Ealing Broadway",
                              "duration": "00:09:00",
                              "from_point_name": "Stratford",
                              "line_name": "Central",
                              "mode": "tube",
                              "to_point_name": "Liverpool Street"}]},
            {"arrival_date": "2019-07-07",
             "arrival_time": "12:57",
             "departure_date": "2019-07-07",
             "departure_time": "12:48",
             "duration": "00:09:00",
             "route_parts": [{"arrival_time": "12:57",
                              "coordinates": [[-0.00336, 51.54171],
                                               .
                                               .
                                               .
                                              [-0.08219, 51.51805]],
                              "departure_time": "12:48",
                              "destination": "West Ruislip",
                              "duration": "00:09:00",
                              "from_point_name": "Stratford",
                              "line_name": "Central",
                              "mode": "tube",
                              "to_point_name": "Liverpool Street"}]}],
 "source": "TfL journey planning API"}

您可以使用 json.loads() 将该字符串从 API 转换为 Python 字典,然后,只需迭代其内容并将键和值放入您想要的格式:

import json

data = json.loads(get_data())

for route in data['routes']:
    for route_part in route['route_parts']:
        print('Source:', route_part['from_point_name'])
        print('Route:')
        print('Line:', route_part['line_name'])
        print('To:', route_part['destination'])
        print('Duration:', route_part['duration'])
        # etc ...

        print()  # Blank line.

【讨论】:

    【解决方案2】:

    首先要做的是使用 JSON 模块将 JSON 字符串解析为 dict

    import json
    
    data = json.loads(get_data())
    

    从现在开始,您可以像使用任何 dict 一样获取数据,并使用它来格式化字符串。例如:

    pretty_data = ""
    for route in data["routes"]:
        pretty_data += """Source: {}
    Destination: {}
    
    ...""".format(route["route_parts"][0]["from_point_name"], route["route_parts"][-1]["to_point_name"])
    

    【讨论】:

      【解决方案3】:

      希望这会有所帮助,“数据”应该是从您的 JSON 中解析出来的字典。

      data = json_dictionary
      
      
      print ('Request Time: ' + data['request_time'])
      print ('Source: ' + data['source'])
      print ('Acknowledgements: ' + data['acknowledgements'])
      print ()
      
      
      for x in (data['routes']):
      
          for y in x['route_parts']:
      
              print ('Departure Date: ' + x['departure_date'])
              print ('From Point Name: ' + y['from_point_name'])
              print ('To Point Name: ' + y['to_point_name'])
              print ('Destination: ' + y['destination'])
              print ('Line Name: ' + y['line_name'])
              print ('Duration: ' + y['duration'])
              print ('Departure Time: ' + y['departure_time'])
              print ('Duration: ' + y['duration'])
              print ('Arrival Time: ' + y['arrival_time'])
      
              #for z in y['coordinates']:
              #    print ('Coordinates' + z)
      
              print ()
      

      输出:

      Request Time: 2019-06-10T00:50:45+01:00
      Source: TfL journey planning API
      AcknowledgementsTransport for London
      
      Departure Date: 2019-07-07
      From Point Name: Stratford
      To Point Name: Liverpool Street
      Destination: Ealing Broadway
      Line Name: Central
      Duration: 00:09:00
      Departure Time: 12:46
      Duration: 00:09:00
      Arrival Time: 12:55
      
      Departure Date: 2019-07-07
      From Point Name: Stratford
      To Point Name: Liverpool Street
      Destination: West Ruislip
      Line Name: Central
      Duration: 00:09:00
      Departure Time: 12:48
      Duration: 00:09:00
      Arrival Time: 12:57
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 2017-07-29
        • 2017-08-29
        • 2018-04-13
        • 2016-02-26
        相关资源
        最近更新 更多