Python, jsonpath: Как мне получить указанную c информацию о списке из json через текстовое поле? - PullRequest
0 голосов
/ 03 апреля 2020

Вот мой пример JSON dat от url, на самом деле существует более сотни данных.

{
"items": [
    {
        "timestamp": "2020-04-03T23:24:27+08:00",
        "carpark_data": [
            {
                "carpark_info": [
                    {
                        "total_lots": "91",
                        "lot_type": "C",
                        "lots_available": "36"
                    }
                ],
                "carpark_number": "HE12",
                "update_datetime": "2020-04-03T23:23:34"
            },
            {
                "carpark_info": [
                    {
                        "total_lots": "583",
                        "lot_type": "C",
                        "lots_available": "474"
                    }
                ],
                "carpark_number": "HLM",
                "update_datetime": "2020-04-03T23:23:23"
            },
            {
                "carpark_info": [
                    {
                        "total_lots": "322",
                        "lot_type": "C",
                        "lots_available": "126"
                    }
                ],
                "carpark_number": "RHM",
                "update_datetime": "2020-04-03T23:23:35"
            },
            {
                "carpark_info": [
                    {
                        "total_lots": "97",
                        "lot_type": "C",
                        "lots_available": "85"
                    }
                ],
                "carpark_number": "BM29",
                "update_datetime": "2020-04-03T23:23:43"
            },
            {
                "carpark_info": [
                    {
                        "total_lots": "96",
                        "lot_type": "C",
                        "lots_available": "75"
                    }
                ],
                "carpark_number": "Q81",
                "update_datetime": "2020-04-03T23:23:21"
            },
            {
                "carpark_info": [
                    {
                        "total_lots": "173",
                        "lot_type": "C",
                        "lots_available": "55"
                    }
                ],
                "carpark_number": "C20",
                "update_datetime": "2020-04-03T23:23:24"
            }

        ]
    }
]

Я пишу следующий код, чтобы получить carpark_data, когда пользовательские ключи в соответствующем carpark_number указаны в текстовом поле.

например, если для ввода в текстовое поле используется HLM. Я ожидаю, что результат будет

[
  {
    "carpark_info": [
      {
        "total_lots": "583",
        "lot_type": "C",
        "lots_available": "474"
      }
    ],
    "carpark_number": "HLM",
    "update_datetime": "2020-04-03T23:23:23"
  }
]

Я пытался, как следует, но не уверен, если это возможно ... Может кто-нибудь помочь мне в этом? Я совершенно новичок в этом ..

from kivymd.uix.dialog import MDInputDialog
from urllib import parse
from kivy.network.urlrequest import UrlRequest
from kivy.app import App
import json
from jsonpath_ng import jsonpath,parse


class SearchMenu(MDInputDialog):
   title = 'Search by Address'
   text_button_ok = 'Search'

   def __init__(self):
       super().__init__()
       self.size_hint = [.9, .3]
       self.events_callback = self.callback

   def callback(self,*args):
       address = self.text_field.text
       self.get()
       print(address)

   def get(self):
       url= "https://api.data.gov.sg/v1/transport/carpark-availability"
       UrlRequest(url,on_success=self.success, on_failure=self.failure, on_error=self.error)


   def success(self,urlrequest, result):
       print("ok")
       data=[match.value for match in parse(('$..carpark_data[?(@.carpark_number =address)]')).find(result)]
       json_data=json.dumps(data, indent =2 ,separators=(',', ':'))
       print(json_data)

   def failure(self,urlrequest, result):
       print(result)
       print("failure")

   def error(self,urlrequest, result):
       print(result)
       print("error")

...