Как отфильтровать один JSON на основе другого JSON в Python?

#python #json #pandas

#python #json #панды

Вопрос:

Я пытаюсь написать класс Python, который принимает запрос json и массив json, а затем фильтрует массив на основе данных в запросе. Вот базовая структура папок для проекта:

 my_input/
 /request.json
 /array.json

my_python/
 /class.py

  

request.json содержит данные «place: 1» и «trait: 3» и имеет следующий вид:

 {
    "metadata": {
        "id": "request",
    },
    "data": {
        "place": [
            "1"
        ],
        "trait": [
            "3"
        ]
    }
}
  

array.json имеет 2 подмассива, locationArray и measurementArray; в locationArray мы видим, что место 1 связано с графиками 2 и 3:

 {  "data":{
    "measurementArray": {
      "headers": ["plot","trait","value"],
      "data": [
        [1, 3, 2.7],
        [2, 2, 1.8],
        [3, 3, 3.6]
       ], 
    "locationArray": {
      "headers": ["place","plot"],
      "data": [
        [1,2],
        [3,4],
        [1,3]
       ], 
       }}}
  

Затем мы фильтруем графики 2 и 3, где «признак: 3». В этом примере он вернет только одну строку из массива измерений, потому что только одна строка, которая была на графике 2 или 3, имела признак 3:

         [3,3,3.6]
  

Как я мог бы написать класс для анализа запроса json, а затем отфильтровать массив во втором JSON? В настоящее время у меня есть только пустой класс.

Большое спасибо за рассмотрение этого вопроса!

Ответ №1:

Я не уверен, работает ли это

 class my_input:

    def __init__(self,my_request, my_array):
        self.my_request = my_request
        self.my_array = my_array

    def get_places(self):
        return self.my_request['data']['place']

    def get_traits(self):
        return self.my_request['data']['trait']

    def get_associated_plots(self,places):
        associated_plots = []
        place_st = set(places)
        for current_data in self.my_array['data']['measurementArray']['locationArray']['data']:
            if str(current_data[0]) in place_st:
                associated_plots.append(current_data[1])
        return associated_plots

    def get_rows(self,associated_plots,traits):
        triats_st = set(traits)
        associated_plots_st = set(associated_plots)

        for current_data in self.my_array['data']['measurementArray']['data']:
            rows = []
            if current_data[0] in associated_plots_st and str(current_data[1]) in triats_st:
                rows.append(current_data)
        return rows