解析深度嵌套的JSON文件

时间:2020-05-13 13:42:09

标签: python json pandas normalize

我正在努力通过json_normalize获得所需的信息。我查看了文档以及可能深度嵌套的JSON文件的10个示例,但我不太了解该函数的上下文以提取正确的信息。我正在尝试建立一个数据框,其中将包含每个传感器的带有时间戳的值(值键)。 1534023900是UTC秒的时间戳。

enter image description here

下面是JSON的简短示例。

有什么想法吗?

{
    "created": "2020-05-12T15:10:37Z",
    "device": {
        "device_info": {
            "device_fw": 204,
            "device_sn": "06-02133",
            "device_trait": 2,
            "device_type": 190
        },
        "timeseries": [
            {
                "configuration": {
                    "sensors": [
                        {
                            "measurements": [
                                "BATTERY",
                                "BATTERY_MV"
                            ],
                            "port": 7,
                            "sensor_bonus_value": "Unavailable",
                            "sensor_firmware_ver": "Unavailable",
                            "sensor_number": 133,
                            "sensor_sn": "Unavailable"
                        },
                        {
                            "measurements": [
                                "REFERENCE_KPA",
                                "TEMPC_LOGGER"
                            ],
                            "port": 8,
                            "sensor_bonus_value": "Unavailable",
                            "sensor_firmware_ver": "Unavailable",
                            "sensor_number": 134,
                            "sensor_sn": "Unavailable"
                        }
                    ],
                    "valid_since": "2018-08-11T21:45:00Z",
                    "values": [
                        [
                            1534023900,
                            0,
                            19,
                            [
                                {
                                    "description": "Battery Percent",
                                    "error": false,
                                    "units": "%",
                                    "value": 100
                                },
                                {
                                    "description": "Battery Voltage",
                                    "error": false,
                                    "units": " mV",
                                    "value": 7864
                                }
                            ],
                            [
                                {
                                    "description": "Reference Pressure",
                                    "error": false,
                                    "units": " kPa",
                                    "value": 100.62
                                },
                                {
                                    "description": "Logger Temperature",
                                    "error": false,
                                    "units": " \u00b0C",
                                    "value": 28.34
                                }
                            ]
                        ]
					}
				}
			}
		}
	}	
}

2 个答案:

答案 0 :(得分:0)

修订的JSON

{ “ created”:“ 2020-05-12T15:10:3​​7Z”, “设备”:{ “设备信息”: { “ device_fw”:204, “ device_sn”:“ 06-02133”, “ device_trait”:2 “ device_type”:190 }, “时间序列”: [ { “配置”:{ “传感器”:[ { “测量”: [ “电池”, “ BATTERY_MV” ], “端口”:7 “ sensor_bonus_value”:“不可用”, “ sensor_firmware_ver”:“不可用”, “ sensor_number”:133, “ sensor_sn”:“不可用” }, { “测量”: [ “ REFERENCE_KPA”, “ TEMPC_LOGGER” ], “端口”:8 “ sensor_bonus_value”:“不可用”, “ sensor_firmware_ver”:“不可用”, “ sensor_number”:134, “ sensor_sn”:“不可用” } ], “ valid_since”:“ 2018-08-11T21:45:00Z”, “值”:[ [ 1534023900, 0, 19 [ { “说明”:“电池百分比”, “错误”:错误, “单位”: ”%”, “值”:100 }, { “描述”:“电池电压”, “错误”:错误, “单位”:“ mV”, “值”:7864 } ], [ { “描述”:“参考压力”, “错误”:错误, “ units”:“ kPa”, “值”:100.62 }, { “ description”:“记录仪温度”, “错误”:错误, “ units”:“ \ u00b0C”, “值”:28.34 } ] ] ] } }] } }

答案 1 :(得分:0)

jmespath可以帮助处理嵌套数据:docs非常强大,但是访问数据的基础是:如果它是密钥,那么您可以使用.不是数据中的第一项,如果它是数组/列表,请使用[]

您的数据位置摘要:device -> timeseries(dict)->[](array)->configuration(dict)->values(key)->[](array)->[0](array and get the first value)

实际代码:

import jmespath
expression = jmespath.compile('device.timeseries[].configuration.values[][0]')
expression.search(data)
[1534023900]