使用json.loads识别DataFrame JSON列时,字符型整数引发异常问题
我明白你遇到的问题了——用json.loads()直接处理DataFrame列的时候,遇到非字符串类型的数字(比如整数20180304)会报错,而像'abc'这种没有双引号包裹的字符串也会触发解析异常,导致整个判断逻辑出问题。
核心问题在于json.loads()的输入要求和JSON格式的严格性:
- 它只接受字符串、字节或者字节数组类型的输入,直接传整数会抛出
TypeError - 合法的JSON字符串必须用双引号包裹,裸字符串
'abc'不符合JSON规范,会抛出ValueError
下面是几个针对性的解决方案,从判断是否为有效JSON到安全解析,一步步来:
1. 基础版:判断元素是否为合法JSON值
这个函数会处理空值(None/NaN)、非字符串类型的输入,并用try-except捕获解析异常:
import json import pandas as pd import numpy as np def is_valid_json(x): # 处理DataFrame中的空值 if pd.isna(x): return False # 这里可以根据需求改成True,比如把空值视为有效 try: # 如果输入不是字符串/字节,先转为字符串再解析 if not isinstance(x, (str, bytes)): json.loads(str(x)) else: json.loads(x) return True # 捕获解析失败的异常:ValueError(格式错误)、TypeError(类型错误) except (ValueError, TypeError): return False
2. 进阶版:判断是否为JSON对象/数组
如果你只关心那些是JSON对象(字典)或数组(列表)的元素(而不是单个数字、字符串等JSON值),可以在解析后判断类型:
def is_json_object_or_array(x): if pd.isna(x): return False try: if not isinstance(x, (str, bytes)): parsed = json.loads(str(x)) else: parsed = json.loads(x) # 只判断是否为字典或列表 return isinstance(parsed, (dict, list)) except (ValueError, TypeError): return False
3. 安全解析JSON列的函数
如果你的最终目的是解析JSON列并处理解析失败的情况,可以用这个函数,解析失败时返回None(或者你指定的默认值):
def safe_json_loads(x): if pd.isna(x): return x try: if not isinstance(x, (str, bytes)): return json.loads(str(x)) else: return json.loads(x) except (ValueError, TypeError): # 解析失败时返回None,也可以返回原x或者其他默认值 return None
使用示例
假设你的DataFrame是这样的:
df = pd.DataFrame({ 'json_candidates': [ '{"name": "Alice", "age": 30}', '[1, 2, 3, 4]', 20180304, 'abc', None, np.nan, '"valid_json_string"', True ] })
应用判断函数:
df['is_valid_json'] = df['json_candidates'].apply(is_valid_json) df['is_json_obj_arr'] = df['json_candidates'].apply(is_json_object_or_array) df['parsed_json'] = df['json_candidates'].apply(safe_json_loads)
最终结果会是:
| json_candidates | is_valid_json | is_json_obj_arr | parsed_json |
|---|---|---|---|
| {"name": "Alice"...} | True | True | {'name': 'Alice', 'age': 30} |
| [1, 2, 3, 4] | True | True | [1, 2, 3, 4] |
| 20180304 | True | False | 20180304 |
| abc | False | False | None |
| None | False | False | None |
| NaN | False | False | NaN |
| "valid_json_string" | True | False | valid_json_string |
| True | True | False | True |
这样就完美解决了你遇到的两种问题:
- 非字符串类型的数字会被转为字符串后解析,不会报错
- 不符合JSON规范的裸字符串会被正确识别为无效JSON
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

