Python JSON 数据检索
Python JSON data retrieval
我目前正在尝试从 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
": "+"
}
python JSON 模块将使这变得非常容易。
在调用 raw = json.dumps(<your-data>)
之后调用 decoded = json.loads(raw)
,您可以更轻松地使用 JSON。
问题是你在重新定义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"])
我目前正在尝试从 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
": "+"
}
python JSON 模块将使这变得非常容易。
在调用 raw = json.dumps(<your-data>)
之后调用 decoded = json.loads(raw)
,您可以更轻松地使用 JSON。
问题是你在重新定义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"])