如何在Java中验证JSON字符串?还是可以使用正则表达式解析它?
如何在Java中验证JSON字符串?还是可以使用正则表达式解析它?
Answers:
一个疯狂的主意,尝试解析它并捕获异常:
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;
}
杰克逊图书馆
一种选择是使用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
请注意,由于尾随逗号会在release中修复,因此可能存在“次要”问题3.0.0
。
new ObjectMapper().readTree("28xjRBuOQqupRopHeSuhRQ")
无异常地解析为IntNode(28)。没料到……
使用Google Gson,您可以使用JsonParser:
import com.google.gson.JsonParser;
JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException
您可以使用.mayBeJSON(字符串str)可供JSONUtils库。
这取决于您要通过验证证明的内容。当然,按照其他人的建议解析json比使用正则表达式更好,因为json的语法比仅用正则表达式所代表的语法更复杂。
如果只能通过Java代码解析json,请使用相同的解析器进行验证。
但是,仅进行解析并不一定告诉您在其他环境中是否可以接受。例如
如果您的验证需要非常彻底,则可以:
String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");
请下载stringtree-json库
在这里,您可以找到可以验证JSON文件的工具,也可以使用任何JSON库反序列化JSON文件,如果操作成功,则该文件应有效(例如google-json,如果输入内容会抛出异常解析无效的JSON)。
恕我直言,最优雅的方法是使用Java API进行JSON处理(JSON-P),这是符合JSR 374的JavaEE标准之一。
try(StringReader sr = new StringReader(jsonStrn)) {
Json.createReader(sr).readObject();
} catch(JsonParsingException e) {
System.out.println("The given string is not a valid json");
e.printStackTrace();
}
使用Maven,添加对JSON-P的依赖关系:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
请访问JSON-P官方页面以获取更多信息。
这是使用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在Java中是否有效,并提供更多信息和带有各种无效示例的扩展测试用例。
我找到了一个非常简单的解决方案。
请先net.sf.json-lib
为其安装该库。
import net.sf.json.JSONException;
import net.sf.json.JSONSerializer;
private static boolean isValidJson(String jsonStr) {
boolean isValid = false;
try {
JSONSerializer.toJSON(jsonStr);
isValid = true;
} catch (JSONException je) {
isValid = false;
}
return isValid;
}
public static void testJson() {
String vjson = "{\"employees\": [{ \"firstName\":\"John\" , \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
String ivjson = "{\"employees\": [{ \"firstName\":\"John\" ,, \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
System.out.println(""+isValidJson(vjson)); // true
System.out.println(""+isValidJson(ivjson)); // false
}
做完了 请享用
答案部分正确。我也面临同样的问题。解析json并检查异常似乎是通常的方法,但是对于输入的json解决方案失败,例如
{“ outputValueSchemaFormat”:“”,“ sortByIndexInRecord”:0,“ sortOrder”:847874874387209“降序”} kajhfsadkjh
如您所见,由于存在尾随垃圾字符,因此json无效。但是,如果您尝试使用jackson或gson解析上述json,那么您将获得有效json的已解析映射,垃圾尾部字符将被忽略。当您使用解析器检查json有效性时,这不是必需的解决方案。
有关此问题的解决方案,请参见此处。
PS:这个问题是我提出并回答的。
public static boolean isJSONValid(String test) {
try {
isValidJSON(test);
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(test);
while (!parser.isClosed()) {
parser.nextToken();
}
} catch (Exception e) {
LOGGER.error("exception: ", e);
return false;
}
return true;
}
private static void isValidJSON(String test) {
try {
new JSONObject(test);
} catch (JSONException ex) {
try {
LOGGER.error("exception: ", ex);
new JSONArray(test);
} catch (JSONException ex1) {
LOGGER.error("exception: ", ex1);
throw new Exception("Invalid JSON.");
}
}
}
以上解决方案涵盖了两种情况:
使用该javax.json
库的解决方案:
import javax.json.*;
public boolean isTextJson(String text) {
try {
Json.createReader(new StringReader(text)).readObject();
} catch (JsonException ex) {
try {
Json.createReader(new StringReader(text)).readArray();
} catch (JsonException ex2) {
return false;
}
}
return true;
}
您可以使用Validol中的WellFormedJson
类声明验证库。
该声明本身可能如下所示:
new WellFormedJson(
new Unnamed<>(Either.right(new Present<>(jsonRequestString)))
)
检查阶段如下所示:
Result<JsonElement> result =
(new WellFormedJson(
new Named<>(
"vasya",
Either.right(
new Present<>(
"{\"guest\":{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"},\"source\":1,\"items\":[{\"id\":1900},{\"id\":777}]}"
)
)
)
))
.result();
assertTrue(result.isSuccessful());
assertEquals(
"{\"guest\":{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"},\"source\":1,\"items\":[{\"id\":1900},{\"id\":777}]}",
result.value().raw().toString()
);
assertEquals(
"{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"}",
result.value().raw().getAsJsonObject().get("guest").toString()
);
对于这样一个简单的任务来说,这似乎有些矫kill过正,但是当您必须验证一个复杂的请求时,它就显得闪闪发光。请查看Validol的快速入门部分。