报错 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)

异常代码

  1. ...
  2. JSONObject jsonObject = k8sConfigUtils.deployGoMinio(companyCode, storage);
  3. jsonObject.put("msg", jsonObject.getString("message"));
  4. jsonObject.put("type", "minio");
  5. jsonObject.put("success", "");
  6. jsonObject.put("company", companyCode);
  7. JSONArray jsonArray = new JSONArray();
  8. jsonArray.add(jsonObject);
  9. result.addAll(getConfigItemInfoBos(companyCode,jsonArray));
  10. ...
  11. private List<ConfigItemInfoBo> getConfigItemInfoBos(String companyCode, JSONArray configArray) {
  12. List<ConfigItemInfoBo> result = new ArrayList<>();
  13. // 刷一次配置,支持重复刷,只新增,不覆盖
  14. copyConfigFromDefaultCluster(companyCode);
  15. Map<String, String> configItemMap = new ConcurrentHashMap<>();
  16. // 解析配置
  17. for (int i = 0; i < configArray.size(); i++) {
  18. // 示例:
  19. // {"nginx": {"ip": "192.168.0.72", "port": "32348", "company": "company", "success": true, "msg": "success"}}
  20. JSONObject jsonObject = configArray.getJSONObject(i);
  21. // 只有一个key,直接获取
  22. String typeName = jsonObject.keySet().iterator().next();
  23. ConfigItemInfoBo configItemInfoBo = jsonObject.getObject(typeName, ConfigItemInfoBo.class);
  24. configItemInfoBo.setTypeName(typeName);
  25. // 配置转换
  26. ServiceTypeEnum.handleConfig(true, configItemInfoBo, configItemMap);
  27. result.add(configItemInfoBo);
  28. if (!Boolean.valueOf(configItemInfoBo.getSuccess())) {
  29. throw new ServiceException("部署结束," + configItemInfoBo.getMsg());
  30. }
  31. }
  32. ...
  33. }
  34. ...

大致过程就是,通过 http 请求拿取json数据,解析为 jsonObject,然后再往 jsonObject 添加字段,接着new JsonArray,并将 jsonObject 放入到 JsonArray 中。最后将 JsonArray 作为参数,传入到对应的方法中解析。尴尬的事情发生了,报错了。

解决

查了半天,原来自己的 json 构建错误,该打