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

新手上路,请多包涵

我有必须检查 JSON 是否有效的方法,可在 How to check whether a given string is valid JSON in 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

原文由 QkiZ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 703
2 个回答

我找到了解决方案,但使用 org.json 库,根据 如何检查给定字符串是否是 Java 中的有效 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"} 是真的。

原文由 QkiZ 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

  • Gson 是一个执行 反序列 化的对象,因此它将 整个 JSON 反序列化为内存中的一个对象。
  • Gson ,我不知道,对于一些无效的 JSON 可能不是很严格: bncjbhjfjhj 被反序列化为 java.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());

输出:

类 com.google.gson.internal.LinkedTreeMap

类 java.lang.String

您在这里可以做的是使用 JsonReader 读取传入的 JSON 令牌,从而确定给定的 JSON 文档在语法上是否有效。

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

输出:

真的

错误的

原文由 Lyubomyr Shaydariv 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题