我目前正在尝试从JSON行提取数据,并将数据存储在数组中。 数据是一个数学方程式,具有运算符,组和值
{
"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)
编辑:
在我的一些数学公式中,我必须提供括号,它们按类型显示:" group"在我的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
": "+"
}
答案 0 :(得分: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"])
答案 1 :(得分:-1)
python JSON模块将极大地简化这一过程。
在调用raw = json.dumps(<your-data>)
后跟decoded = json.loads(raw)
后,您可以更轻松地使用JSON。