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

PySpark from_json解析含转义字符JSON返回null的解决方法咨询

解决Spark from_json解析含HTML实体与转义字符的JSON字符串返回Null的问题

你的JSON字符串同时包含HTML实体编码("对应双引号)和转义字符,导致from_json无法正确解析。核心解决思路是先将HTML实体还原为标准JSON格式,再进行解析,以下是具体实现方案:

方案1:正则替换处理HTML实体

直接用regexp_replace将"替换为双引号,再调用from_json解析:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, regexp_replace, from_json
from pyspark.sql.types import StructType, StructField, StringType

spark = SparkSession.builder.appName("JsonParse").getOrCreate()

# 定义JSON结构schema
json_schema = StructType([
    StructField("key", StringType()),
    StructField("value", StringType())
])

# 构造测试DataFrame
df = spark.createDataFrame(
    [
        (1, '{"key":"abc","value":"\\"cde\\""}')
    ],
    ["id", "text"]
)

# 清理HTML实体并解析JSON
df = df.withColumn(
    "cleaned_text",
    regexp_replace(col("text"), """, '"')
).withColumn(
    "dictext",
    from_json(col("cleaned_text"), json_schema)
)

display(df)

运行后dictext列会正常解析出嵌套结构,其中value字段的值为"cde"(包含双引号)。

方案2:通用HTML实体解码(支持更多实体)

如果JSON中包含&、<等其他HTML实体,可通过Python的html模块编写UDF做通用解码:

import html
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

# 定义HTML解码UDF
html_decode_udf = udf(lambda s: html.unescape(s), StringType())

# 解码后解析JSON
df = df.withColumn(
    "cleaned_text",
    html_decode_udf(col("text"))
).withColumn(
    "dictext",
    from_json(col("cleaned_text"), json_schema)
)

display(df)

验证解析结果

可通过get_json_object快速验证单个字段的解析情况:

from pyspark.sql.functions import get_json_object

df.withColumn(
    "value_field",
    get_json_object(col("cleaned_text"), "$.value")
).select("id", "value_field").show()

输出示例:

+---+----------+
| id|value_field|
+---+----------+
|  1|   "cde"  |
+---+----------+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:45:51