报错 expect {, actual string, pos 0
错误信息
com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.73
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:515)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:1613)
at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_1_ConfigItemInfoBo.deserialze(Unknown Source)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:296)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:694)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:395)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:299)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:572)
at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:1216)
at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1038)
at com.alibaba.fastjson.JSONObject.getObject(JSONObject.java:163)
at com.pandora.service.impl.ApolloAppManageServiceImpl.getConfigItemInfoBos(ApolloAppManageServiceImpl.java:212)
at com.pandora.service.impl.ApolloAppManageServiceImpl.lambda$oneKey$7(ApolloAppManageServiceImpl.java:527)
at java.base/java.lang.Thread.run(Unknown Source)
异常代码
...
JSONObject jsonObject = k8sConfigUtils.deployGoMinio(companyCode, storage);
jsonObject.put("msg", jsonObject.getString("message"));
jsonObject.put("type", "minio");
jsonObject.put("success", "");
jsonObject.put("company", companyCode);
JSONArray jsonArray = new JSONArray();
jsonArray.add(jsonObject);
result.addAll(getConfigItemInfoBos(companyCode,jsonArray));
...
private List<ConfigItemInfoBo> getConfigItemInfoBos(String companyCode, JSONArray configArray) {
List<ConfigItemInfoBo> result = new ArrayList<>();
// 刷一次配置,支持重复刷,只新增,不覆盖
copyConfigFromDefaultCluster(companyCode);
Map<String, String> configItemMap = new ConcurrentHashMap<>();
// 解析配置
for (int i = 0; i < configArray.size(); i++) {
// 示例:
// {"nginx": {"ip": "192.168.0.72", "port": "32348", "company": "company", "success": true, "msg": "success"}}
JSONObject jsonObject = configArray.getJSONObject(i);
// 只有一个key,直接获取
String typeName = jsonObject.keySet().iterator().next();
ConfigItemInfoBo configItemInfoBo = jsonObject.getObject(typeName, ConfigItemInfoBo.class);
configItemInfoBo.setTypeName(typeName);
// 配置转换
ServiceTypeEnum.handleConfig(true, configItemInfoBo, configItemMap);
result.add(configItemInfoBo);
if (!Boolean.valueOf(configItemInfoBo.getSuccess())) {
throw new ServiceException("部署结束," + configItemInfoBo.getMsg());
}
}
...
}
...
大致过程就是,通过 http 请求拿取json数据,解析为 jsonObject,然后再往 jsonObject 添加字段,接着new JsonArray,并将 jsonObject 放入到 JsonArray 中。最后将 JsonArray 作为参数,传入到对应的方法中解析。尴尬的事情发生了,报错了。
解决
查了半天,原来自己的 json 构建错误,该打