Skip to content

JsonObjectParser 可能拒绝包含 BOM 或特殊 Unicode 的合法 JSON #3224

Description

@He-Pin

Motivation

JsonObjectParser 使用 256-byte 查表验证 JSON 字符,可能拒绝包含 BOM(Byte Order Mark)或特殊 Unicode 字符的合法 JSON 输入。

当前代码行为

JsonObjectParser.scala 中:

// JsonObjectParser.scala:116-180
private val outerChars: Array[Byte] = new Array[Byte](256)

使用 256-byte 查表验证 JSON 顶层字符。任何不在 [, ], {, , 或 whitespace 范围内的字节都会触发错误(通过 1 / outer 在 142 行,catch ArithmeticException 后抛出 FramingException)。

某些合法 JSON 可能包含:

  • UTF-8 BOM(EF BB BF
  • 顶层数组/对象外的特殊字符

预期行为

应正确处理 BOM 前缀,并对非 ASCII 字符更宽容(JSON 规范允许 Unicode 字符)。

代码证据

  • stream/src/main/scala/org/apache/pekko/stream/impl/JsonObjectParser.scala:116-180 — 查表逻辑和错误处理

复现方式

// 带 BOM 的 JSON 流
val jsonWithBom = ByteString(Array(0xEF.toByte, 0xBB.toByte, 0xBF.toByte)) ++ ByteString("""[{"key":"value"}]""")
Source.single(jsonWithBom)
  .via(JsonFraming.detector)
  .runWith(Sink.head)
// 可能抛出 FramingException

影响范围

  • 模块:pekko-stream
  • 影响从文件/网络读取 JSON 流的用户
  • BOM 前缀是某些系统(如 Windows)的常见输出格式

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions