我有一个包含JSON对象的字符串。如何查找它是否包含JSON对象并提取它?除了按字符拆分,是否有更好的方法?
"String Notify : {"id": "1234", "transactionId": "TR-001", "timestamp": "1575445871"} with result success"
我有一个包含JSON对象的字符串。如何查找它是否包含JSON对象并提取它?除了按字符拆分,是否有更好的方法?
"String Notify : {"id": "1234", "transactionId": "TR-001", "timestamp": "1575445871"} with result success"
使用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);
}
但是这段代码只能从较大的字符串中获取类似于序列化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解析器。
在Java中,您可以使用许多方法来完成此操作:
方法1:GSON
Google的Gson是一个开源库,用于处理Java程序中的JSON。
Gson g = new Gson();
Player p = g.fromJson(jsonString, Player.class)
方法二:Jackson
Jackson是Java世界中最受欢迎的JSON解析库。它快速且功能丰富。
Player ronaldo = new ObjectMapper().readValue(jsonString, Player.class);
这不是一个很好的解决方案,但它可以工作。您可以改进正则表达式,以自动包含花括号而不是将它们连接起来。
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 添加到你的库中
indexOf('{')
和lastIndexOf('}')+1
之间的substring()
。 - tevemadaraaa { aaa {"id": 123} aaa
。正则表达式也是如此,我认为您不能将其用于更复杂的情况。 - Karol Dowbecki