问题描述
最近开发一个jar,配置信息没有使用配置文件来修改,想着直接通过json启动程序会更加方便,程序写好了,在调试shell脚本时,发现json解析一直有问题
报错信息如下:
Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, pos 9, line 1, column 10{a:{aa1:a1,aa2:a2},b:{bb1:b1,bb2:b2}}
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1510)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1390)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:616)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:581)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1430)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1390)
at com.alibaba.fastjson.JSON.parse(JSON.java:181)
at com.alibaba.fastjson.JSON.parse(JSON.java:191)
at com.alibaba.fastjson.JSON.parse(JSON.java:147)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:252)
json 文件格式如下:
{
"a": {
"aa1": "a1",
"aa2": "a2"
},
"b": {
"bb1": "b1",
"bb2": "b2"
}
}
问题排查
通过打印String[] args,打印的字符串下:
{
a:{
aa1:a1,
aa2:a2
},
b:{
bb1:b1,
bb2:b2
}
}
比对输入和输出的数据可以发现,通过main进来的参数,"
被舍弃
如果加上\
转义符是否能解决这个问题?
{
\"a\": {
\"aa1\": \"a1\",
\"aa2\": \"a2\"
},
\"b\": {
\"bb1\": \"b1\",
\"bb2\": \"b2\"
}
}
结果是发现没问题的
解决方案
既然知道了加上转义符后可以正常运行,那么我只需要修改一下shell脚本,将"
替换为\"
j即可
这里直接给出命令:
# 定义一个json模板
jsontmp='{"a":{"aa1":"a1","aa2":"a2"},"b":{"bb1":"b1","bb2":"b2"}}'
# 将 " 替换为 \" ,并且在json的头部和尾部添加 "
param=`echo $jsontmp | sed 's/"/\\\"/g' |sed 's/^/"/g' | sed 's/$/"/g'`
# 打印 json模板
echo $param
此时$param
可以作为main方法的入参配置,程序正常运行