2015-01-07 3 views
0

В настоящее время я пытаюсь извлечь данные из строки JSON и хранить данные в массиве. Данные математическое уравнение и имеет операторы, группу и значениеPython JSON data retrieval

{ 
    "rightArgument": { 
     "cell": "C6", 
     "value": 13394.5, 
     "type": "cell" 
    }, 
    "leftArgument": { 
     "rightArgument": { 
      "value": "20", 
      "type": "constant" 
     }, 
     "leftArgument": { 
      "rightArgument": { 
       "value": "90", 
       "type": "constant" 
      }, 
      "leftArgument": { 
       "value": "100", 
       "type": "constant" 
      }, 
      "type": "operation", 
      "operator": "+" 
     }, 
     "type": "operation", 
     "operator": "+" 
    }, 
    "type": "operation", 
    "operator": "+" 
} 

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

В настоящее время у меня есть этот Python код:

def _getCurrentOperator(data): # function to find current scope operator, pass in the current scope ie data, rightargument, leftargument 


    list.append(data["operator"]) 
    data = data["rightArgument"] 
    list.append(data["value"]) 
    data = data["leftArgument"] 
    _getCurrentOperator(data) 

редактировать:

В некоторых из моих математических формул, которые я должен обслужить скобки, которые показаны по типу: «группа» в моем файле формата JSON : вот пример файла JSON:

{ 
    "rightArgument": { 
     "rightArgument": { 
      "value": "2", 
      "type": "constant" 
     }, 
     "leftArgument": { 
      "value": "90", 
      "type": "constant" 
     }, 
     "type": "operation", 
     "operator": "/" 
    }, 
    "leftArgument": { 
     "rightArgument": { 
      "arguments": [], 
      "name": "pi", 
      "type": "function" 
     }, 
     "leftArgument": { 
      "rightArgument": { 
       "argument": { 
        "rightArgument": { 
         "value": "100", 
         "type": "constant" 
        }, 
        "leftArgument": { 
         "rightArgument": { 
          "cell": "C7", 
          "value": 13604.5, 
          "type": "cell" 
         }, 
         "leftArgument": { 
          "rightArgument": { 
           "value": "20", 
           "type": "constant" 
          }, 
          "leftArgument": { 
           "value": "90", 
           "type": "constant" 
          }, 
          "type": "operation", 
          "operator": "/" 
         }, 
         "type": "operation", 
         "operator": "*" 
        }, 
        "type": "operation", 
        "operator": "+" 
       }, 
       "type": "group" 
      }, 
      "leftArgument": { 
       "value": "100", 
       "type": "constant" 
      }, 
      "type": "operation", 
      "operator": "+" 
     }, 
     "type": "operation", 
     "operator": "+" 
    }, 
    "type": "operation", 
    "operator 

": "+" 
} 
+1

Можете ли вы представить пример того, как вы хотите, чтобы эти данные были представлены в массиве? В вашем примере есть четкая рекурсивная структура, которая будет потеряна в случае массива. –

+0

Вы хотите использовать вложенные массивы для представления вложенной структуры словаря во входных данных? Что тогда, если нет? – martineau

+0

Вы говорите: «В настоящее время я пытаюсь извлечь данные из строки JSON». Какая линия? – martineau

ответ

2

Проблема в том, что вы переопределяете data, поэтому, когда вы пытаетесь получить левый аргумент, data уже является правильным аргументом. Кроме того, вы должны остановить рекурсию, когда левым аргументом является значение.

Попробуйте это:

def _getCurrentOperator(data): 
    if "operator" in data:    # case 1: operator 
     list.append(data["operator"]) 
     right = data["rightArgument"] # other var name 
     list.append(right["value"]) 
     left = data["leftArgument"]  # other var name 
     _getCurrentOperator(left) 
    else:        # case 2: value 
     list.append(data["value"]) 

Учитывая ваши данные испытаний, list выходит как ['+', 13394.5, '+', '20', '+', '90', '100']

Конечно, это все еще работает, только если ваш правый аргумент всегда является значение и никогда другого оператора. (. И как примечание стороны, вы, кажется, также замена левой и правой) В этом случае, вы можете попробовать это:

def _getCurrentOperator(data): 
    if "operator" in data: 
     list.append(data["operator"]) 
     _getCurrentOperator(data["leftArgument"]) 
     _getCurrentOperator(data["rightArgument"]) 
    else: 
     list.append(data["value"]) 

Чтобы обработать все те другие типы узлов, просто добавить больше случаев, как это (возможно, неполное):

def _getCurrentOperator(data): 
    if data["type"] == "operation": 
     list.append(data["operator"]) 
     _getCurrentOperator(data["rightArgument"]) 
     _getCurrentOperator(data["leftArgument"]) 
    elif data["type"] == "group": 
     _getCurrentOperator(data["argument"]) 
    elif data["type"] == "function": 
     list.append(data["name"]) # TODO do something with arguments 
    else: 
     list.append(data["value"]) 
+0

Это замечательно, код работает; однако теперь я пытаюсь адаптировать код, чтобы обслуживать скобки в моих математических уравнениях. В JSON это представлено типом «Группа». Я отредактировал мой код выше, чтобы показать это – Craig

+0

@Craig Мое редактирование должно помочь вам на правильном пути. В основном вам нужно будет добавить больше случаев, например 'if data ['type'] == 'operation': ... elif data ['type'] == 'group': ...' и т. Д. –

+0

Ах, фантастика, вы очень помогли! Как вы, вероятно, можете сказать, что я новичок в этом, и я был брошен в глубоком конце создания этой программы к пятнице (никогда не касался или не видел ни Python, ни JSON раньше)! Престижность к вам! – Craig

-1

модуль python JSON сделает это очень легко.

После звонка raw = json.dumps(<your-data>), а затем decoded = json.loads(raw), вы можете работать с JSON намного проще.