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"])