如何使用GSON检查JSON在Java中是否有效?

2022-09-03 17:16:13

我有一个必须检查JSON是否有效的方法,可以在如何检查给定的字符串在Java中是否有效但不起作用中找到。

public static boolean isJson(String Json) {
        Gson gson = new Gson();
        try {
            gson.fromJson(Json, Object.class);
            return true;
        } catch (com.google.gson.JsonSyntaxException ex) {
            return false;
        }
    }

如果我将此方法与某个字符串一起使用,它总是返回true。例如:

System.out.println(renderHtml.isJson("{\"status\": \"UP\"}"));

它给了我,和true

System.out.println(renderHtml.isJson("bncjbhjfjhj"));

也给了我。true


答案 1

您不应 使用 进行此类验证:Gson

  • Gson是执行反序列化的对象,因此它将整个 JSON 反序列化为内存中的对象。
  • Gson,我不知道,对于一些无效的JSON来说可能不是很严格:被反序列化为一个实例。惊喜-惊喜!bncjbhjfjhjjava.lang.String
private static final Gson gson = new Gson();

private static final String VALID_JSON = "{\"status\": \"UP\"}";
private static final String INVALID_JSON = "bncjbhjfjhj";

System.out.println(gson.fromJson(VALID_JSON, Object.class).getClass());
System.out.println(gson.fromJson(INVALID_JSON, Object.class).getClass());

输出:

class com.google.gson.internal.LinkedTreeMap
class java.lang.String

您可以在此处执行的操作是使用逐个令牌读取传入的JSON令牌,从而使给定的JSON文档在语法上有效。JsonReader

private static boolean isJsonValid(final String json)
        throws IOException {
    return isJsonValid(new StringReader(json));
}

private static boolean isJsonValid(final Reader reader)
        throws IOException {
    return isJsonValid(new JsonReader(reader));
}

private static boolean isJsonValid(final JsonReader jsonReader)
        throws IOException {
    try {
        JsonToken token;
        loop:
        while ( (token = jsonReader.peek()) != END_DOCUMENT && token != null ) {
            switch ( token ) {
            case BEGIN_ARRAY:
                jsonReader.beginArray();
                break;
            case END_ARRAY:
                jsonReader.endArray();
                break;
            case BEGIN_OBJECT:
                jsonReader.beginObject();
                break;
            case END_OBJECT:
                jsonReader.endObject();
                break;
            case NAME:
                jsonReader.nextName();
                break;
            case STRING:
            case NUMBER:
            case BOOLEAN:
            case NULL:
                jsonReader.skipValue();
                break;
            case END_DOCUMENT:
                break loop;
            default:
                throw new AssertionError(token);
            }
        }
        return true;
    } catch ( final MalformedJsonException ignored ) {
        return false;
    }
}

然后测试它:

System.out.println(isJsonValid(VALID_JSON));
System.out.println(isJsonValid(INVALID_JSON));

输出:



答案 2

我找到了解决方案,但使用库,根据如何检查给定的字符串在Java中是否有效JSONorg.json

public static boolean isJson(String Json) {
        try {
            new JSONObject(Json);
        } catch (JSONException ex) {
            try {
                new JSONArray(Json);
            } catch (JSONException ex1) {
                return false;
            }
        }
        return true;
    }

现在,随机查看的字符串是真的。bncjbhjfjhjfalse{"status": "UP"}