如何在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
相关产品推荐
相关产品推荐

