java - 将格式错误的 json 数组字符串转换为 Java 对象
问题描述
我有一个格式错误的 json 数组字符串,我从 API 调用中获得如下:
[{\"ResponseCode\":1,\"ResponseMsg\":\"[{\"Code\":\"CA2305181\",\"Message\":\"Processed successfully\"}]\"}]
Response Msg
属性值中的方括号前有一个双引号。有没有办法将其转换为 Java 对象?
到目前为止我所尝试的:我使用杰克逊来解析它,但它给出了错误
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(new ResponseNameStrategy());
Response[] response = mapper.readValue(strOutput1, Response[].class);
Error: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
我也尝试过使用 Gson 来解析它,但它也给出了错误
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create();
Response[] response = gson.fromJson(strOutput1, Response[].class);
Error: Expected BEGIN_ARRAY but was STRING at line 1 column 35 path $[0].ResponseMsg
我已经浏览了 StackOverflow 上的以下链接,但没有一个解决了我的问题:
解决方案
我认为答案在评论中,您似乎试图在错误的地方解决问题。
您正在接收您希望解析为 java 对象的 json,不幸的是 json 格式错误,因此不会解析。
作为一般规则,您永远不应该尝试解决症状,而应该寻找根本原因并修复它,这听起来可能微不足道,但修复症状会导致混乱、不可预测和无法维护的系统。
所以答案是修复它被破坏的json。如果这是您控制的事情或您的控制,那么在您等待修复时,您可以在解析它之前放入一个 hack 来修复 json。
这样您就不会破坏您的解析,并且当第三方解决了问题时,只需删除一小部分字符串替换即可。但是不要使用 hack,它应该只在开发过程中使用。
推荐阅读
- java - 将 S3ObjectInputStream 映射到输入流
- javascript - 将关联数组字符串转换为数组
- c++ - While 循环中的 C++ cin 输入验证
- asp.net-core - ASP.NET Core 声明未正确获取
- javascript - vue-msal 无法解析端点。请检查网络并重试。详细信息:函数 toString() { [本机代码] }
- javascript - 如何使用 javascript 在此代码中添加计时器?
- python - 无法从包含日期的数据框列中提取年份
- python - 如何绘制 pd.Series 并使用来自另一个数据源的每个点的颜色?
- reactjs - 如何以 formik 形式从 DOM 中删除空的错误 div?
- javascript - 似乎无法获取 alt 属性