我目前正在尝试从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) 编辑:
在我的一些数学公式中,我必须考虑括号,这些括号由JSON文件中的类型:"group“显示:下面是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
": "+"
}发布于 2015-01-07 13:25:34
问题是您正在重新定义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"])发布于 2015-01-07 13:22:12
python模块将大大简化这一工作。
在调用raw = json.dumps(<your-data>)之后,然后是decoded = json.loads(raw),您可以更容易地使用JSON。
https://stackoverflow.com/questions/27820365
复制相似问题