将格式错误的json数组字符串转换为Java对象

时间:2018-05-25 06:34:11

标签: java json

我有一个格式错误的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?

JSON Array to Java objects

Convert json String to array of Objects

converting 'malformed' java json object to javascript

3 个答案:

答案 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"));   
    }

}

返回:

enter image description here

答案 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自定义对象数组:

Convert json String to array of Objects