从没有唯一标记的 JSON 文件中提取值

一个有唯一标记(或更适当的字段名)前置的值的 json 文件很容易解析,因为你可以在这些唯一标记/字段名中执行字符串搜索,以找到值的第一个和最后一个字符的位置,并用这些信息确定值的位置,然后提取值。 我已经用各种 lua 脚本和 Python 脚本(也用于 xml 文件)执行过该函数。

现在需要从一个没有唯一标记/字段名,而只是多个“value_type”和“value”的 json 文件中提取值,分别是名字和值:请参见下面的示例。

{
    "software_version": "NRZ-2017-099",
    "age":"78",
    "sensordatavalues":[
        {"value_type":"SDS_P1","value":"4.43"},
        {"value_type":"SDS_P2","value":"3.80"},
        {"value_type":"temperature","value":"20.10"},
        {"value_type":"humidity","value":"44.50"},
        {"value_type":"samples","value":"614292"},
        {"value_type":"min_micro","value":"233"},
        {"value_type":"max_micro","value":"25951"},
        {"value_type":"signal","value":"-66"}
    ]
}

像上面描述的经验并没有提供可行的解决方案。

问题: 在这个 json 文件布局中,如何直接提取特定的个体值(最好由 lua 脚本)?

[或者 XML 解析提供了一个更简单的解决方案吗?]

点赞
用户14343
用户14343

下面是 Python 代码,用于读取 JSON 文件并使其更加便捷:

import json
import pprint

with open("/tmp/foo.json") as j:
    data = json.load(j)

for sdv in data.pop('sensordatavalues'):
    data[sdv['value_type']] = sdv['value']

pprint.pprint(data)

结果:

{'SDS_P1': '4.43',
 'SDS_P2': '3.80',
 'age': '78',
 'humidity': '44.50',
 'max_micro': '25951',
 'min_micro': '233',
 'samples': '614292',
 'signal': '-66',
 'software_version': 'NRZ-2017-099',
 'temperature': '20.10'}
2018-02-23 14:09:33
用户2261273
用户2261273

你可能想要查看过滤函数。

例如,在您的示例“json”中,仅获取包含“samples”值的字典,可以通过以下方式进行:

sample_sensordata = list(filter(lambda d: d["value_type"] == "samples", your_json_dict["sensordatavalues"]))

sample_value = sample_sensordata["value"]

要像Ned Batchelder所说的那样创建字典,您也可以使用类似于以下内容的字典推导:

sensor_data_dict = {d['value_type']: d['value'] for d in a}

然后只需通过sensor_data_dict['<您要查找的值类型>']获取所需的值

2018-02-23 14:16:43
用户5554685
用户5554685

有点晚了,我正在尝试使用 Anvil,之前的回答都没用。只是为了好奇的人。

resp = anvil.http.request("http://<ipaddress>/data.json", json=True)
#print(resp) # 打印 json 文件
tempdict = resp['sensordatavalues'][2].values()
humiddict = resp['sensordatavalues'][3].values()
temperature = float(list(tempdict)[1])
humidity = float(list(humiddict)[1])
print(temperature)
print(humidity)
2021-07-26 13:35:36