从字符串获取JSON对象的最佳方法

时间:2019-12-04 10:03:29

标签: java

我有一个包含JSON对象的字符串。如何找到它是否具有JSON对象并进行获取?有没有比按字符分割更好的方法了?

"String Notify : {"id": "1234", "transactionId": "TR-001", "timestamp": "1575445871"} with result success"

4 个答案:

答案 0 :(得分:3)

带有last/IndexOf()的简单版本:

String testData="String Notify : {\"id\": \"1234\", \"transactionId\": \"TR-001\", \"timestamp\": \"1575445871\"} with result success";
int jsonStart=testData.indexOf('{');
int jsonEnd=testData.lastIndexOf('}')+1;
if(jsonStart>=0 && jsonEnd>jsonStart) {
    String jsonPart=testData.substring(jsonStart,jsonEnd);
    System.out.println(jsonPart);
}

测试:https://ideone.com/rgiH10

但是这段代码只是从更大的字符串中获取了一个看起来像一个字符串化JSON对象的部分,而解析又是另一回事了。

答案 1 :(得分:2)

一种解决方案,将处理嵌套和不平衡的对象并返回与第一个最外层JSON对象相对应的子字符串:

int depth=0;
StringBuilder currentJsonString=new StringBuilder();
boolean containsValidJson = false;
for (char c: input.toCharArray()) {
    if (c == '{') { depth++; }
    else if (c == '}' && depth > 0) { // if depth==0, the } isn't part of a JSON object
        depth--;
        if (depth == 0) {
            currentJsonString.append(c);
            containsValidJson = true;
            break;
        }
    }
    if (depth > 0) { currentJsonString.append(c); }
}
// at this point if containsValidJson is true, call currentJsonString.toString() to get the JSON object

您可以try it here

请注意,它不验证JSON的其他功能,仅验证正确的括号。如果要验证提取的子字符串,您将希望将其传递给适当的JSON解析器。

答案 2 :(得分:1)

在Java中,您可以使用多种方法来做到这一点:

方法1:GSON
Google的Gson是一个开放源代码库,用于处理Java程序中的JSON

Gson g = new Gson();
Player p = g.fromJson(jsonString, Player.class)

方法2:杰克逊
Jackson是Java世界中最流行的JSON解析库。快速且功能丰富。

Player ronaldo = new ObjectMapper().readValue(jsonString, Player.class);

显然,对于他们来说,您需要了解JSON String的格式并创建具有这些属性的类(如Player.class)。如果JSON格式未知,则在这种情况下,您必须手动拆分。

答案 3 :(得分:0)

这不是一个很好的解决方案,但是它可以工作。您可以改进正则表达式,使其自动包含花括号,而不是将其串联。

        String x="String Notify : {\"id\": \"1234\", \"transactionId\": \"TR-001\", \"timestamp\": \"1575445871\"} with result success";
        Pattern logEntry = Pattern.compile("(?<=\\{)([^\\}]+)(?=\\})");
        Matcher matchPattern = logEntry.matcher(x);

        while(matchPattern.find()) {
            String json = "{" + matchPattern.group(1) + "}";
            try {
                JSONObject jsonObject = new JSONObject(json);
                System.out.println("Found a json");
           }catch (JSONException err){
                err.printStackTrace();
           }
        }

别忘了将org.json添加到您的书架中