使用 Python 从 JSON 中删除值为 NaN 的对象?

Remove object from JSON whose values are NaN using Python?

我的最终输出JSON文件格式如下

    [
     {
    "Type": "UPDATE",
    "resource": {
        "site ": "Lakeside mh041",
        "name": "Total Flow",
        "unit": "CubicMeters",
        "device": "2160 LaserFlow Module",
        "data": [
            {
                "timestamp": [
                    "1087009200"
                ],
                "value": [
                    6945.68
                ]
            },
            {
                "timestamp": [
                    "1087095600"
                ],
                "value": [
                    NaN
                ]
            },
            {
                "timestamp": [
                    "1087182000"
                ],
                "value": [
                    7091.62
                ]
            },

如果 "value" 是 NaN,我想删除整个对象。

预期输出

     [
      {
    "Type": "UPDATE",
    "resource": {
        "site ": "Lakeside mh041",
        "name": "Total Flow",
        "unit": "CubicMeters",
        "device": "2160 LaserFlow Module",
        "data": [
            {
                "timestamp": [
                    "1087009200"
                ],
                "value": [
                    6945.68
                ]
            },
            {
                "timestamp": [
                    "1087182000"
                ],
                "value": [
                    7091.62
                ]
            },

由于文件格式的原因,我无法从我的 csv 文件中删除空白值。

我试过这个:

  with open('Result.json' , 'r') as j:
     json_dict = json.loads(j.read())
     json_dict['data'] = [item for item in json_dict['data'] if 
        len([val for val in item['value'] if isnan(val)]) == 0]

  print(json_dict)

错误 - json_dict['data'] = [item for item in json_dict['data'] if len([val for val in item['value'] 如果 isnan(val)]) == 0] 类型错误:列表索引必须是整数或切片,而不是 str

要测试值是否为 NaN,您可以使用 math.isnan() 函数 (doc):

data = '''{"data": [
            {
                "timestamp": [
                    "1058367600"
                ],
                "value": [
                    9.65
                ]
            },
            {
                "timestamp": [
                    "1058368500"
                ],
                "value": [
                    NaN
                ]
            },
            {
                "timestamp": [
                    "1058367600"
                ],
                "value": [
                    4.75
                ]
            }
        ]}'''

import json
from math import isnan

data = json.loads(data)
data['data'] = [i for i in data['data'] if not isnan(i['value'][0])]

print(json.dumps(data, indent=4))

打印:

{
    "data": [
        {
            "timestamp": [
                "1058367600"
            ],
            "value": [
                9.65
            ]
        },
        {
            "timestamp": [
                "1058367600"
            ],
            "value": [
                4.75
            ]
        }
    ]
}

如果 json"value": [...] 有多个值 那么,

import json
from math import isnan

json_str = '''
[
    {
        "Type": "UPDATE",
        "resource": {
            "site ": "Lakeside mh041",
            "name": "Total Flow",
            "unit": "CubicMeters",
            "device": "2160 LaserFlow Module",
            "data": [
                {
                     "timestamp": [
                         "1087009200"
                     ],
                    "value": [
                         6945.68
                     ]
                },
                {
                    "timestamp": [
                        "1087095600"
                    ],
                    "value": [
                        NaN
                    ]
                }
            ]
        }
    }
]
'''

json_dict = json.loads(json_str)

for typeObj in json_dict:
    resource_node = typeObj['resource']
    resource_node['data'] = [
        item for item in resource_node['data']
        if len([val for val in item['value'] if isnan(val)]) == 0
    ]

print(json_dict)