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

如何在plokhotnyuk的jsoniter库codec中获取字节数组或字符串内的元素类型

结论

完全可以实现,直接使用jsoniter库内置的token类型检测能力即可,比读取raw字符串后自行解析性能更高、稳定性更强,不会出现转义字符、内容特殊字符导致的判断错误。

实现方案

你调用in.nextToken()获取的返回值本身就是JSON元素类型的标识,jsoniter已经将所有JSON类型的首字符作为token返回值,直接判断该值即可完成类型识别,且识别后调用in.rollbackToken()回退token,不会影响后续的读取逻辑。

步骤1:定义类型枚举用来返回识别结果

enum JsonType:
  case Array, Map, String, Integer, Boolean, Null

步骤2:封装类型识别方法

import com.github.plokhotnyuk.jsoniter_scala.core.JsonReader

def getCurrentJsonType(in: JsonReader): JsonType =
  val token = in.nextToken()
  in.rollbackToken() // 回退token,不破坏原有读取流程
  token match
    case '[' => JsonType.Array // 对应Python list类型
    case '{' => JsonType.Map // 对应Python dict类型
    case '"' => JsonType.String
    case t if t >= '0' && t <= '9' || t == '-' => JsonType.Integer
    case 't' | 'f' => JsonType.Boolean
    case 'n' => JsonType.Null
    case _ => in.decodeError("非法的JSON token")

步骤3:使用示例

import java.nio.charset.StandardCharsets

// 先识别类型
val jsonType = getCurrentJsonType(in)
// 原有读取raw值的逻辑完全不受影响
val rawValue = new String(in.readRawValAsBytes(), StandardCharsets.UTF_8)

识别结果和你需要的对应关系:

  • 输入["a", "b"] => 返回JsonType.Array,对应Python的<class 'list'>
  • 输入{"22": "11"} => 返回JsonType.Map,对应Python的<class 'dict'>
  • 输入"test" => 返回JsonType.String
  • 输入678 => 返回JsonType.Integer

注意事项

  • 如果需要区分整数和浮点数,在数字判断分支中调用in.isFloat()方法即可快速判断,无需自行解析字符串
  • 不要自行解析raw字符串判断类型,容易遇到字符串内容包含特殊字符、转义字符等边界问题,库内置的token判断已经覆盖了所有JSON规范的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:07