如何在Java中验证JSON字符串?或者我可以使用正则表达式解析它吗?
如何在Java中验证JSON字符串?或者我可以使用正则表达式解析它吗?
一个疯狂的想法,尝试解析它并捕获异常:
import org.json.*;
public boolean isJSONValid(String test) {
try {
new JSONObject(test);
} catch (JSONException ex) {
// edited, to include @Arthur's comment
// e.g. in case JSONArray is valid as well...
try {
new JSONArray(test);
} catch (JSONException ex1) {
return false;
}
}
return true;
}
这段代码使用的是org.json JSON API实现,可在GitHub上、Maven中以及部分适用于Android平台。
JACKSON Library
使用Jackson库是其中之一选择。首先导入最新版本(目前为止):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
那么,您可以按照正确答案的方式进行实现:
import com.fasterxml.jackson.databind.ObjectMapper;
public final class JSONUtils {
private JSONUtils(){}
public static boolean isJSONValid(String jsonInString ) {
try {
final ObjectMapper mapper = new ObjectMapper();
mapper.readTree(jsonInString);
return true;
} catch (IOException e) {
return false;
}
}
}
Google GSON 选项
另一个选项是使用Google Gson。导入依赖项:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.5</version>
</dependency>
同样,您可以按以下方式实现所建议的解决方案:
import com.google.gson.Gson;
public final class JSONUtils {
private static final Gson gson = new Gson();
private JSONUtils(){}
public static boolean isJSONValid(String jsonInString) {
try {
gson.fromJson(jsonInString, Object.class);
return true;
} catch(com.google.gson.JsonSyntaxException ex) {
return false;
}
}
}
这里将进行简单的测试:
//A valid JSON String to parse.
String validJsonString = "{ \"developers\": [{ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
"{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";
// Invalid String with a missing parenthesis at the beginning.
String invalidJsonString = "\"developers\": [ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
"{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";
boolean firstStringValid = JSONUtils.isJSONValid(validJsonString); //true
boolean secondStringValid = JSONUtils.isJSONValid(invalidJsonString); //false
请注意,由于末尾逗号可能会出现“小”问题,这个问题将在发布3.0.0
版本中得到解决。
new ObjectMapper().readTree("28xjRBuOQqupRopHeSuhRQ")
解析时没有抛出异常,而是将其解析为IntNode(28)。这并不是预期的结果... - mgaert使用Google Gson,您可以使用JsonParser:
import com.google.gson.JsonParser;
JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException
if ! .mayBeJSON(str){ log(str as error)}else{ parseJSON(str)}
- Yu Jiaao关于解析的一些信息:
Json,以及所有语言,都使用语法,这是一组可用作替换的规则。为了解析json,您需要基本上反向工作出这些替换。
Json是一个无上下文语法,这意味着您可以拥有无限嵌套的对象/数组,而json仍然有效。正则表达式只处理正则语法(因此名称中带有“reg”),这是上下文自由语法的子集,不允许无限嵌套,因此仅使用正则表达式无法解析所有有效的json。您可以使用一组复杂的正则表达式和循环,假设没有人嵌套超过100个级别,但仍然会非常困难。
如果您准备编写自己的解析器
您可以在确定语法后制作递归下降解析器。
String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");
检查给定的字符串是否是有效的 JSON,在 Kotlin 中。我将 MByD 的 Java 答案转换成了 Kotlin。
fun isJSONValid(test: String): Boolean {
try {
JSONObject(test);
} catch (ex: JSONException) {
try {
JSONArray(test);
} catch (ex1: JSONException) {
return false;
}
}
return true;
}
这是使用 gson 库进行严格的 JSON 解析的工作示例:
public static JsonElement parseStrict(String json) {
// throws on almost any non-valid json
return new Gson().getAdapter(JsonElement.class).fromJson(json);
}
请参阅我在如何使用GSON在Java中检查JSON是否有效的其他详细答案,其中包含更多信息和各种非有效示例的扩展测试用例。
{"outputValueSchemaFormat": "","sortByIndexInRecord": 0,"sortOrder":847874874387209"descending"}kajhfsadkjh
正如您所看到的,由于存在尾随垃圾字符,该json格式不正确。但是,如果您尝试使用jackson或gson解析上述json,则会获得有效json的解析映射,并且忽略垃圾尾随字符。这不是在使用解析器检查json有效性时所需的解决方案。
有关此问题的解决方案,请参见此处。
附言:这个问题是我提出并回答的。