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;
}
이 코드는 github, maven 및 Android에서 사용 가능한 org.json JSON API 구현을 사용합니다.
잭슨 라이브러리
한 가지 방법은 잭슨 도서관을 이용하는 것입니다.먼저 최신 버전을 Import합니다(현재 버전).
<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
.
Google Gson에서는 JsonParser를 사용할 수 있습니다.
import com.google.gson.JsonParser;
JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException
.BeJ 를 사용할 수 있습니다.SON(String str)은 JSONUtils 라이브러리에서 사용할 수 있습니다.
이것은, 검증으로 무엇을 증명하려고 하는가에 따라 다릅니다.json의 문법은 regex만으로 나타낼 수 있는 것보다 더 복잡하기 때문에 다른 사람들이 제안한 대로 json을 해석하는 것이 정규식을 사용하는 것보다 낫다.
json이 Java 코드에 의해서만 해석되는 경우는, 같은 파서를 사용해 검증합니다.
그러나 구문 분석만으로 다른 환경에서 사용할 수 있는지 여부를 알 수 있는 것은 아닙니다.
- 많은 파서는 오브젝트 또는 배열의 말미에 있는 쉼표를 무시하지만 IE의 이전 버전은 말미에 있는 쉼표를 누르면 실패할 수 있습니다.
- 다른 파서는 후행 콤마를 사용할 수 있지만 뒤에 정의되지 않은/늘 엔트리를 추가할 수 있습니다.
- 일부 파서는 따옴표로 묶지 않은 속성 이름을 사용할 수 있습니다.
- 일부 파서는 비 ASC에 대해 다르게 반응할 수 있습니다.문자열의 II 문자
철저한 검증이 필요한 경우 다음을 수행할 수 있습니다.
- 위에서 언급한 모든 코너 케이스에서 불합격하는 파서를 찾을 때까지 다른 파서를 사용해 보십시오.
- .scriptax.script를 하여 jsonlint를 실행할 도 있습니다*,
- javax.script 입니다.*를 사용하여 jshint를 실행하는 것과 결합합니다.
해석에 대해서:
Json, 그리고 사실 모든 언어는 대체어로 사용할 수 있는 규칙 집합인 문법을 사용합니다.json을 해석하기 위해서는 기본적으로 그 치환을 역순으로 풀어야 합니다.
Json은 컨텍스트 자유 문법입니다.즉, 무한히 중첩된 오브젝트/어레이를 가질 수 있으며 json은 여전히 유효합니다.regex는 정규 문법만 처리합니다(이름에 'reg'를 붙임).이것은 무한 네스트를 허용하지 않는 컨텍스트 자유 문법의 서브셋이기 때문에 regex만을 사용하여 모든 유효한 json을 해석하는 것은 불가능합니다.복잡한 정규식과 루프의 세트를 사용할 수 있습니다.아무도 100레벨을 넘지 않는다는 가정 하에 말이죠.하지만 여전히 매우 어렵습니다.
한 후에 수 .
String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");
stringtree-json 라이브러리를 다운로드하십시오.
다음은 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이 유효한지 확인하는 방법 및 유효하지 않은 다양한 예를 사용한 확장 테스트 케이스를 참조하십시오.
답은 부분적으로 옳다.나도 같은 문제에 직면했다.json을 해석하고 예외를 확인하는 것은 일반적인 방법처럼 보이지만 입력 json에 대한 솔루션은 실패합니다.
{"output Value Schema Format": "", sortByIndexInRecord": 0,"sortOrder":847874874387209"descending"}kajhfsadkjh
보시다시피 json은 후행 가비지 문자가 있기 때문에 유효하지 않습니다.그러나 Jackson 또는 gson을 사용하여 위의 json을 구문 분석하려고 하면 유효한 json의 구문 분석된 맵을 얻을 수 있으며 가비지 후행 문자는 무시됩니다.json의 유효성을 확인하기 위해 파서를 사용할 때 필요한 솔루션이 아닙니다.
이 문제의 해결 방법에 대해서는, 여기를 참조해 주세요.
PS: 이 질문은 제가 묻고 대답한 것입니다.
지정된 문자열이 Kotlin에서 유효한 JSON인지 확인합니다.MByD Java의 답변을 Kotlin으로 변환했습니다.
fun isJSONValid(test: String): Boolean {
try {
JSONObject(test);
} catch (ex: JSONException) {
try {
JSONArray(test);
} catch (ex1: JSONException) {
return false;
}
}
return true;
}
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;
}
여기서 JSON 파일을 검증하거나 JSON 라이브러리와 함께 JSON 파일을 역직렬화할 수 있는 도구를 찾을 수 있습니다. 작업이 성공하면 유효합니다(예를 들어 구문 분석 중인 입력이 유효한 JSON이 아닌 경우 예외를 발생시키는 google-json).
Playframework 2.6을 사용하면 Java api에 있는 Json 라이브러리를 사용하여 문자열을 간단히 해석할 수도 있습니다.문자열은 json 배열의 json 요소일 수 있습니다.여기서 반환되는 값은 중요하지 않기 때문에 구문 분석 오류를 검출하여 문자열이 올바른 json 문자열인지 여부를 판단합니다.
import play.libs.Json;
public static Boolean isValidJson(String value) {
try{
Json.parse(value);
return true;
} catch(final Exception e){
return false;
}
}
IMHO에서 가장 우아한 방법은 JSR 374에 준거한 JavaEE 규격 중 하나인 Java API for JSON Processing(JSON-P)을 사용하는 것입니다.
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 공식 페이지를 참조하십시오.
보시는 바와 같이 많은 솔루션이 있으며, 주로 JSON을 분석하여 확인하고, 마지막에는 확실하게 분석해야 합니다.
그러나 상황에 따라 사전 점검을 통해 성능을 향상시킬 수 있습니다.
API를 호출할 때 수행하는 작업은 첫 번째 문자가 '{'이고 마지막 문자가 '}'인지 확인하는 것입니다.그렇지 않다면 굳이 파서를 만들 필요가 없습니다.
나는 그것에 대한 매우 간단한 해결책을 찾았다.
먼저 이 라이브러리를 설치하십시오.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
}
됐다. 즐겨라
import static net.minidev.json.JSONValue.isValidJson;
다음으로 JSON String으로 전달되는 함수를 호출합니다.
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.");
}
}
}
위의 솔루션은 다음 두 가지 시나리오를 모두 포함합니다.
- 중복 키
- 따옴표 불일치 또는 괄호 누락 등
아래 코드를 사용해 보세요.제 밑에서 일했습니다.
import org.json.JSONObject;
import org.json.JSONTokener;
public static JSONObject parseJsonObject(String substring)
{
return new JSONObject(new JSONTokener(substring));
}
사용할 수 있습니다.WellFormedJson
validol 선언적 검증 라이브러리의 클래스.
선언 자체는 다음과 같습니다.
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()
);
이러한 간단한 작업에는 과잉으로 보일 수 있지만 복잡한 요청을 검증해야 할 때 효과가 있습니다.validol의 빠른 시작 섹션을 확인하십시오.
언급URL : https://stackoverflow.com/questions/10174898/how-to-check-whether-a-given-string-is-valid-json-in-java
'IT이야기' 카테고리의 다른 글
Vue Full Calendar의 다음 달 및 이전 달 감시자 (0) | 2022.06.12 |
---|---|
보이드의 크기는 얼마입니까? (0) | 2022.06.12 |
동시에 2개의 다른 요소에 대한 전이 페이드인 및 페이드아웃 (0) | 2022.06.12 |
최소/최대 검증 - Vuetify (0) | 2022.06.12 |
할당 후 입력값 변경 (0) | 2022.06.12 |