簡體   English   中英

從沒有唯一標記的 json 文件中提取值

[英]Extract values from json-file which has no unique markers

在值之前具有唯一標記(或 [更合適的] 字段名稱)的 json 文件(相當)易於剖析,因為您可以對唯一標記/字段名稱執行字符串搜索以在字符串中找到值字符的第一個和最后一個位置,根據該信息,您可以確定值的位置,並提取該值。 已經使用各種 lua 腳本和 Python 腳本(也在 xml 文件上)執行了該功能。

現在需要從沒有唯一標記/字段名稱的 json 文件中提取值,而只是在“名稱”和“值”之前多次出現“value_type”和“value”:見下文。

{
    "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-filelayout 中,如何直接提取特定的、單獨的值(最好通過 lua-script)?

[或者 XML 解析是否可以提供更簡單的解決方案?]

這是讀取JSON文件並使其更方便的Python:

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'}

您可能想看看過濾器功能。

例如,在您的示例json ,僅獲取包含您可以通過的samples值的字典:

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

sample_value = sample_sensordata["value"]

要制作像 Ned Batchelder 所說的字典,您還可以使用這樣的 dict 理解:

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

然后通過sensor_data_dict['<ValueTypeYouAreLookingFor>']獲取你想要的值

有點晚了,我正在嘗試 Anvil,其中以前的答案不起作用。 只為好奇的人。

  resp = anvil.http.request("http://<ipaddress>/data.json", json=True)
  #print(resp) # prints json file
  tempdict = resp['sensordatavalues'][2].values() 
  humiddict = resp['sensordatavalues'][3].values()
  temperature = float(list(tempdict)[1])
  humidity = float(list(humiddict)[1])
  print(temperature)
  print(humidity)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM