返回 json 教程首页

JSON 常见错误

这篇文章专门讲两类问题:JSON 语法错误,以及在各语言里调用 JSON 解析方法时最常见的报错。

很多人以为“JSON 很简单”,直到接口上线后才发现解析报错在日志里刷屏。

JSON 的问题通常不难,但定位顺序很关键:先确认输入是不是合法 JSON,再看语言层的类型映射与解析参数。

你可以把这篇当作排错手册,遇到问题时按章节逐条对照。

一、最常见的 JSON 语法错误

1) 键没有用双引号

JSON 要求对象键必须是双引号字符串,`name`这种写法只在 JavaScript 对象字面量里合法。

wrong-1.json
1{
2 name: "tom",
3 "age": 18
4}
fixed-1.json
1{
2 "name": "tom",
3 "age": 18
4}
  • JavaScript: SyntaxError: Unexpected token n in JSON at position 4
  • Python: JSONDecodeError: Expecting property name enclosed in double quotes

2) 最后一个键值对后面多了逗号

尾逗号在很多语言的对象字面量里能通过,但在 JSON 里不允许。

wrong-2.json
1{
2 "id": "U1001",
3 "enabled": true,
4}
fixed-2.json
1{
2 "id": "U1001",
3 "enabled": true
4}
  • JavaScript: SyntaxError: Unexpected token } in JSON at position ...
  • Go: invalid character '}' looking for beginning of object key string

3) 使用了单引号

JSON 字符串只能用双引号,单引号会被视为非法字符。

wrong-3.json
1{
2 'name': 'alice',
3 'city': 'shanghai'
4}
fixed-3.json
1{
2 "name": "alice",
3 "city": "shanghai"
4}
  • JavaScript: SyntaxError: Unexpected token ' in JSON at position ...
  • PHP: JsonException: Syntax error

4) 加了注释

标准 JSON 不支持`//`或`/* */`注释。

wrong-4.json
1{
2 "name": "json",
3 //
4 "version": 1
5}
fixed-4.json
1{
2 "name": "json",
3 "version": 1
4}
  • JavaScript: SyntaxError: Unexpected token / in JSON at position ...
  • Python: JSONDecodeError: Expecting property name enclosed in double quotes

5) 字符串中的引号没有转义

字符串中出现双引号时必须转义,否则会提前结束字符串。

wrong-5.json
1{
2 "message": "He said: "hello""
3}
fixed-5.json
1{
2 "message": "He said: \"hello\""
3}
  • JavaScript: SyntaxError: Unexpected token h in JSON at position ...
  • Python: JSONDecodeError: Expecting ',' delimiter

二、各语言调用 JSON 解析方法时的常见错误

JavaScript

JSON.parse(payload)
parser-case-1
1const payload = "{\"age\":\"18\"}"
2const data = JSON.parse(payload)
3console.log(data.age + 1)

常见报错:逻辑错误:`data.age`是字符串,拼接时可能得到`"181"`。

根因:JSON 解析本身成功了,但业务字段类型与你的计算预期不一致。

修复建议:解析后先做类型校验与转换,例如`Number(data.age)`。

Python

json.loads(payload)
parser-case-2
1import json
2payload = "{'id': 1}"
3obj = json.loads(payload)

常见报错:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes

根因:输入用了单引号,不是合法 JSON。

修复建议:确保输入是标准 JSON 格式,键和值字符串都使用双引号。

Java(Jackson)

new ObjectMapper().readTree(payload)
parser-case-3
1String payload = "{\"name\":\"tom\",}";
2ObjectMapper mapper = new ObjectMapper();
3JsonNode node = mapper.readTree(payload);

常见报错:com.fasterxml.jackson.core.JsonParseException: Unexpected character ('}' ...)

根因:尾逗号导致 JSON 语法非法。

修复建议:去掉尾逗号;必要时把原始入参完整打印,先在解析器里验证。

Go

json.Unmarshal(data, &dst)
parser-case-4
1type User struct {
2 Age int `json:"age"`
3}
4
5data := []byte("{\"age\":\"18\"}")
6var u User
7err := json.Unmarshal(data, &u)

常见报错:json: cannot unmarshal string into Go struct field User.age of type int

根因:JSON 里`age`是字符串,但结构体字段定义为`int`。

修复建议:统一字段类型;或者先用`map[string]any`接收后再转换。

C#(.NET)

JsonSerializer.Deserialize<T>(json)
parser-case-5
1record User(int Age);
2var json = "{\"age\":\"18\"}";
3var user = JsonSerializer.Deserialize<User>(json);

常见报错:The JSON value could not be converted to System.Int32. Path: $.age ...

根因:目标模型字段是数值,输入却是字符串。

修复建议:修正接口字段类型,或在反序列化前后做显式转换。

PHP

json_decode($json, true, 512, JSON_THROW_ON_ERROR)
parser-case-6
1$json = '{"name":"tom",}';
2$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);

常见报错:JsonException: Syntax error

根因:输入 JSON 有语法问题(此例为尾逗号)。

修复建议:捕获异常并记录原始 JSON,再用解析工具先做语法校验。

三、快速排错清单

  • 先验证原始字符串是不是合法 JSON,不要直接猜业务逻辑。
  • 确认字段类型是否和目标模型一致,特别是数字、布尔、时间、null。
  • 解析失败时记录完整报错、行列位置、请求 ID 和原始片段。
  • 接口联调阶段约定字段契约,避免同名字段在多服务里语义不同。
  • 对外接口加 Schema 校验,尽量把错误拦截在入口层。

四、建议的自检动作

遇到报错先把原文贴进本站“json 在线解析”,先定位语法,再回到业务代码修复。

打开 json 在线解析
valid-example.json
1{
2 "orderId": "SO-1001",
3 "amount": "199.00",
4 "paid": true
5}
invalid-example.json
1{
2 "orderId": "SO-1001",
3 "amount": "199.00",
4}

JSON 问题最怕“边猜边改”。

按“语法合法性 -> 字段类型 -> 业务语义”三步走,定位速度会快很多。