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