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

Java 从字符串获取JSON对象的最佳方法,java,Java,我有一个包含JSON对象的字符串。如何找到它是否有JSON对象并获取它?有没有比按字符拆分更好的方法 "String Notify : {"id": "1234", "transactionId": "TR-001", "timestamp": "1575445871"} with result success" 带有last/IndexOf()的简单版本: 测试: 但这段代码只是从更大的字符串中得到了看起来像字符串化JSON对象的部分,解析是另一回事。这不是一个很好的解决方案,但它会起作用。

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

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

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

测试:


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

这不是一个很好的解决方案,但它会起作用。您可以改进正则表达式,使其自动包含大括号,而不是将它们连接起来

        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();
           }
        }
String x=“字符串通知:{\'id\':\'1234\',\'transactionId\':\'TR-001\',\'timestamp\':\'1575445871\'”,结果成功”;

Pattern logEntry=Pattern.compile(“(?)在Java中,可以使用许多方法来实现:

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

Gson g = new Gson();
Player p = g.fromJson(jsonString, Player.class)
方法2:Jackson
Jackson是Java世界中最流行的JSON解析库,它速度快,功能丰富

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

显然,对于他们来说,你需要知道JSON字符串的格式,并使用这些属性创建一个类(如Player.class)。如果JSON的格式未知,那么在这种情况下,你必须手动拆分。

一种解决方案,它将处理嵌套和不平衡的对象,并返回与第一个最外层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
你可以


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

如果它是单个JSON对象,并且周围没有其他花括号,您可以尝试在
indexOf(“{”)之间获取
子字符串()
lastIndexOf('}'))+1
。您可以使用正则表达式检查字符串中JSON的出现情况,然后将该值作为子字符串,并将结果转换为JSON对象。@tevemadar,您能否将示例作为答案发布,以便我可以接受it@user2342558,请提供答案,以便我能够接受并确认@tevemadar建议的内容不适用于work与
aaa{aaa{“id”:123}aaa
和其他具有不平衡或嵌套括号的输入。与正则表达式相同,我认为您不能将其用于更复杂的情况谢谢。解析工作留给我:)我会处理的
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