文章目录
- 1. 复现问题
- 2. 分析问题
- 3. 解决问题
- 4. 该错误的其他解决方法
- 5. 重要补充
1. 复现问题
今天在JSONObject.parse(json)
这个方法时,却报出如下错误:
com.alibaba.fastjson.JSONException: syntax error, position at 0, name username
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:615)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1367)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1333)
at com.alibaba.fastjson.JSON.parse(JSON.java:155)
at com.alibaba.fastjson.JSON.parse(JSON.java:165)
at com.alibaba.fastjson.JSON.parse(JSON.java:134)
at com.sugon.cloud.lowcode.CommonTest.testJacksonParseJson(CommonTest.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
......
......
简单来说,问题就是syntax error, position at 0, name username
。
2. 分析问题
syntax error, position at 0, name username
错误,来自ChatGPT
的解释如下图:
ChatGPT
告诉我,我的代码中有语法错误,变量名称为username
。
于是查找我的代码,如下所示:
@Test
public void testJacksonParseJson(){
String json = "{\"username\":\"admin\"\"nickname\":\"管理员\"}";
Object parse = JSONObject.parse(json);
System.out.println(parse);
}
通过对我的代码排查,username
变量没有问题。
当然,无法用肉眼去辨别这种错误,需要借助在线解析json
的工具,该工具地址为json在线解析。
我把json
语句复制到工具中,让工具帮我校验,如下图所示:
由于上述代码中的json
是转义后的语句,因为我们点击去转义按钮
,如下图所示:
此时,点击校验 / 格式化
按钮,便能看到是哪里出错了,如下图所示:
从错误信息以及json
对象,可以清晰地看到,admin"
后没有加上逗号(英文逗号)。
3. 解决问题
既然,admin"
后没有加上逗号(英文逗号),我们加上逗号即可,如下代码所示:
@Test
public void testJacksonParseJson(){
String json = "{\"username\":\"admin\",\"nickname\":\"管理员\"}";
Object parse = JSONObject.parse(json);
System.out.println(parse);
}
重新启动测试类,即可成功解析该json
语句,如下图所示:
4. 该错误的其他解决方法
如果上述无法解决你的问题,可以参考如下方法,去解决你的这个问题。
有可能是单引号引发的问题,比如获取到前台传来如下参数:
{
‘key1’:‘value1’
}
实际上,json对象为双引号,如下所示:
{
"key1": "value1"
}
此时,有两种解决方式:
-
前端修改
json
参数,不使用单引号 -
后端将单引号变成双引号。
如果你还有其他方法去解决该问题,欢迎在评论区留言。
5. 重要补充
之前喜欢使用谷歌翻译报错的信息,自从出现了ChatGPT
,便喜欢使用ChatGPT
来翻译。
如果你想了解什么是ChatGPT
以及它的用法,可以点击如下链接:
-
全网最详细的介绍ChatGPT
-
ChatGPT、低代码等技术出现会不会导致底层程序员失业
-
全网推荐7款github上有趣的ChatGPT的应用源码
-
如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用
-
全网详细解读基于java调用ChatGPT的API接口