Python JSON数据检索

时间:2015-01-07 13:15:10

标签: python json

我目前正在尝试从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

": "+"
}

2 个答案:

答案 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。