编写JSON解析器:如何区分字符串中的整数与浮点数?
JSON字符串中整数与浮点数的区分方案
核心判定依据(基于JSON官方规范)
JSON规范(RFC 8259)明确了数字的两种语法特征,这是区分的核心标准:
- 整数:可选正负号,后跟纯数字序列,满足:
- 要么是单个
0 - 要么是以非0数字开头的数字串(不能是
0123这类前置零的形式) - 无小数点、指数标识(
e/E)
- 要么是单个
- 浮点数:只要满足任一以下特征,就判定为浮点数:
- 包含小数点(如
123.、.456、123.456) - 包含
e或E开头的指数部分(如1e5、-2E-3) - 纯数字串但超出目标整数类型的存储范围(比如32位int无法存
2147483648,需按浮点数处理)
- 包含小数点(如
分支处理逻辑
- 先做特征扫描:遍历字符串,跳过开头的正负号后,检查是否存在
.、e、E:- 若存在,直接用
strtod解析为浮点数 - 若不存在,进入整数判定流程
- 若存在,直接用
- 整数有效性验证:
- 用
strtol解析,同时检查解析后的剩余指针是否指向字符串末尾(确保整个串都是有效整数内容,排除123abc这类无效情况) - 对比解析结果与目标整数类型的上下限(比如
INT_MAX/INT_MIN),若在范围内则保留整数类型;若超出,改用strtod解析为浮点数
- 用
- 特殊情况处理:
"0"是整数,"0.0"是浮点数"-0"按JSON规范允许,但因整数无负零概念,建议按浮点数处理
嵌入式场景轻量优化
因为无法使用charconv,可以手动实现极简的字符扫描:
- 手动遍历字符串,跳过开头的
+/- - 逐个检查后续字符,一旦遇到非数字的
./e/E,直接标记为浮点数 - 纯数字场景下,手动做范围判断(比如逐位计算数值,提前判断是否超出整数类型范围,避免
strtol溢出的未定义行为)
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

