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

Polars中str.json_decode解析空字典字符串报错问题求助

解决Polars全空JSON列json_decode报错问题

当你的meta_data列全是"{}"这种空字典字符串时,调用pl.col('meta_data').str.json_decode()会触发PanicException,提示“a StructArray must contain at least one field”——这是因为Polars没法从空字典里推断出结构体的字段。下面是几种实用的解决办法:

方法1:手动指定空结构体Schema

直接给json_decode明确指定一个空结构体类型,告诉Polars即使没有字段也要生成对应类型:

import polars as pl

df = pl.DataFrame({"meta_data": ["{}", "{}"]})
df = df.with_columns(
    pl.col("meta_data").str.json_decode(pl.Struct([]))
)

处理后列会被解析为Struct([])类型,不会触发报错。

方法2:先检测列内容再分支处理

先判断列中所有值是否都是空JSON字典,是的话手动构造空结构体列,否则正常解析:

import polars as pl

df = pl.DataFrame({"meta_data": ["{}", "{}"]})

# 检查所有值是否为空JSON字典
all_empty = df.select(pl.col("meta_data").str.json_path_match("$").is_empty()).all().item()

if all_empty:
    df = df.with_columns(pl.lit(pl.Struct([])).alias("meta_data"))
else:
    df = df.with_columns(pl.col("meta_data").str.json_decode())

方法3:用try_catch自动捕获异常处理

利用Polars的try_catch函数捕获解析异常,报错时返回空结构体,兼容全空和混合内容的场景:

import polars as pl

df = pl.DataFrame({"meta_data": ["{}", "{}"]})
df = df.with_columns(
    pl.col("meta_data").str.json_decode().try_catch(pl.Struct([]))
)

原理说明

json_decode默认会从列中的JSON数据推断结构体字段。当所有JSON都是空字典时,没有字段可以推断,因此抛出异常;而当列中存在带键值对的JSON时,Polars能从非空JSON提取字段,空字典会被解析为对应结构体的空实例(所有字段为null),所以能正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:58:11