IT이야기

Java에서 지정된 문자열이 유효한 JSON인지 확인하는 방법

cyworld 2022. 6. 12. 12:11
반응형

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 문자

철저한 검증이 필요한 경우 다음을 수행할 수 있습니다.

해석에 대해서:

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));
 }

사용할 수 있습니다.WellFormedJsonvalidol 선언적 검증 라이브러리의 클래스.

선언 자체는 다음과 같습니다.

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

반응형