我有一个格式错误的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上的以下链接,但没有一个链接解决了我的问题:
How to Convert String Array JSON in a Java Object
Convert a JSON string to object in Java ME?
答案 0 :(得分:3)
我认为答案在评论中,你似乎试图在错误的地方解决问题。
您正在接收要解析为java对象的json,遗憾的是json格式错误,因此无法解析。
作为一般规则,你永远不应该试图解决症状,但应该寻找根本原因并解决这个问题,这可能听起来微不足道,但修复症状会导致系统混乱,不可预测和不可维护。
所以答案是修复json被破坏的地方。如果这是某些东西或你的控制,当你等待修复时,你可以在解析之前修复json。
这样您就不会破坏解析,只有在第三方修复问题时才会删除一小段字符串。但是不要使用hack,它应该只在开发过程中使用。
答案 1 :(得分:1)
正如我在评论中提到的,您应该准备服务响应以便解析它。
我实施了一个例子:
public class JsonTest {
public static void main(String args[]) throws JsonProcessingException, IOException{
String rawJson =
"[{\"ResponseCode\":1,\"ResponseMsg\":\"[{\"Code\":\"CA2305181\",\"Message\":\"Processed successfully\"}]\"}]";
String goodJson = "{"+rawJson.split("[{{.}]")[2]+"}";
ObjectMapper mapper = new ObjectMapper();
final ObjectNode node = mapper.readValue(goodJson, ObjectNode.class);
System.out.println("Pretty Print: " + mapper.writerWithDefaultPrettyPrinter().writeValueAsString(node));
System.out.println("Just code: " + node.get("Code"));
}
}
返回:
答案 2 :(得分:0)
这就是我最终解决问题的方法:
String inputJsonStr = "[{\"ResponseCode\":1,\"ResponseMsg\":\"[{\"Code\":\"CA2305181\",\"Message\":\"Claim has been added successfully.\"}"
+ "]\"}]";
int indexOfRes = inputJsonStr.indexOf("ResponseMsg");
if(inputJsonStr.substring(indexOfRes+13,indexOfRes+14).equals("\""))
{
inputJsonStr = inputJsonStr.substring(0,indexOfRes+13) + inputJsonStr.substring(indexOfRes+14);
}
int indexOfFirstClosingSquare = inputJsonStr.indexOf("]");
if(inputJsonStr.substring(indexOfFirstClosingSquare+1, indexOfFirstClosingSquare+2).equals("\"")) {
inputJsonStr = inputJsonStr.substring(0, indexOfFirstClosingSquare+1)+inputJsonStr.substring(indexOfFirstClosingSquare+2);
}
现在inputJsonStr
包含一个有效的json数组,可以使用此SO链接中给出的gson轻松地将其解析为Java自定义对象数组: