Разбор сложного JSON в Python без сохранения в файле

#python #json #python-3.x #parsing

#python #json #python-3.x #синтаксический анализ

Вопрос:

Я пытаюсь проанализировать следующие данные JSON, не сохраняя их в файле, используя Python.

 {
  "select": {
    "value": "s_name"
  },
  "from": "student",
  "where": {
    "in": [
      "s_id",
      {
        "select": {
          "value": "s_id"
        },
        "from": "student_course",
        "where": {
          "in": [
            "c_id",
            {
              "select": {
                "value": "c_id"
              },
              "from": "course",
              "where": {
                "or": [
                  {
                    "and": [
                      {
                        "eq": [
                          "c_name",
                          {
                            "literal": "DSA"
                          }
                        ]
                      },
                      {
                        "eq": [
                          "c_name",
                          {
                            "literal": "dbms"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "eq": [
                      "c_name",
                      {
                        "literal": "algorithm"
                      }
                    ]
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
}
 

Я использую следующий код:

 import json

x = "JSON Data which is shared above"
y = json.dumps(x)
jsonDict = json.loads(y)
print (jsonDict['where'])
 

И не уверен, как действовать дальше, не могли бы вы посоветовать, как это можно сделать?
Я хочу получить значение всех объектов, особенно предложения where.

Комментарии:

1. Я не понимаю проблемы. Вы можете использовать загруженный json в качестве стандартного словаря python, возможно, попробуйте прочитать это для ясности, если вы не уверены, как получить данные из dict: realpython.com/python-dicts Для начала, вы можете перебрать все ключи / значения на верхнем уровне с for key, value in jsonDict.items() помощью .

2. Ваш код не имеет никакого смысла. Почему вы это делаете json.dumps(x) ?

Ответ №1:

json.dumps() берет объект и кодирует его в строку JSON. Но вы пытаетесь взять строку JSON и декодировать ее в объект ( dict в данном случае a). Поэтому метод, который вы должны применять x , таков json.loads() . Затем вы можете преобразовать полученный результат dict обратно в строку JSON, y , с json.dumps() :

 import json


x = """{
  "select": {
    "value": "s_name"
  },
  "from": "student",
  "where": {
    "in": [
      "s_id",
      {
        "select": {
          "value": "s_id"
        },
        "from": "student_course",
        "where": {
          "in": [
            "c_id",
            {
              "select": {
                "value": "c_id"
              },
              "from": "course",
              "where": {
                "or": [
                  {
                    "and": [
                      {
                        "eq": [
                          "c_name",
                          {
                            "literal": "DSA"
                          }
                        ]
                      },
                      {
                        "eq": [
                          "c_name",
                          {
                            "literal": "dbms"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "eq": [
                      "c_name",
                      {
                        "literal": "algorithm"
                      }
                    ]
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
}"""

jsonDict = json.loads(x) # from string to a dict
print(jsonDict['where'])
y = json.dumps(jsonDict) # from dict back to a string
 

С принтами:

 {'in': ['s_id', {'select': {'value': 's_id'}, 'from': 'student_course', 'where': {'in': ['c_id', {'select': {'value': 'c_id'}, 'from': 'course', 'where': {'or': [{'and': [{'eq': ['c_name', {'literal': 'DSA'}]}, {'eq': ['c_name', {'literal': 'dbms'}]}]}, {'eq': ['c_name', {'literal': 'algorithm'}]}]}}]}}]}
 

Комментарии:

1. Это не проблема. Одна из причин принять ответ — не просто присудить мне очки, но и показать людям, просматривающим вопросы, что на этот вопрос уже есть принятый ответ.