You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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_candidatesis_valid_jsonis_json_obj_arrparsed_json
{"name": "Alice"...}TrueTrue{'name': 'Alice', 'age': 30}
[1, 2, 3, 4]TrueTrue[1, 2, 3, 4]
20180304TrueFalse20180304
abcFalseFalseNone
NoneFalseFalseNone
NaNFalseFalseNaN
"valid_json_string"TrueFalsevalid_json_string
TrueTrueFalseTrue

这样就完美解决了你遇到的两种问题:

  • 非字符串类型的数字会被转为字符串后解析,不会报错
  • 不符合JSON规范的裸字符串会被正确识别为无效JSON

内容的提问来源于stack exchange,提问作者Abhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:04:21