Проверить, является ли строка допустимой строкой JSON или нет?

Я пытаюсь выполнить запрос SELECT SQL, и после этого мне нужно пройтись по ResultSet, получить columns и проверить, являются ли данные, которые я получил для этих columns, действительными JSON String или нет.

Здесь columnsList — это ArrayList, который будет содержать все имена Columns конкретной таблицы.

ResultSet rs = preparedStatement.executeQuery();

while (rs.next()) {
    for (String column : columnsList.split(",")) {

        //check whether rs.getString(column) is a valid JSON String?
        if(rs.getString(column).ISvalid_JSON_String()) {

            System.out.println("Valid JSON String data")
        }
    }
}

Я не уверен, как мне проверить, являются ли данные, которые я получил для каждого столбца, действительной строкой JSON или нет?

Есть предположения?


person Community    schedule 27.02.2013    source источник
comment
См. stackoverflow.com/questions/10174898/   -  person Mike Q    schedule 28.02.2013


Ответы (2)


Если вам нужно убедиться, что это действительно правильный JSON, вам нужно будет его проанализировать. Быстрый, простой и легкий синтаксический анализатор, который мне нравится, прост в использовании json. Взгляните на их примеры здесь.

http://code.google.com/p/json-simple/wiki/DecodingExamples#Example_2_-_Faster_way:_Reuse_instance_of_JSONParser

Адаптируя ваш код, я получаю:

JSONParser parser = new JSONParser();
ResultSet rs = preparedStatement.executeQuery();

while (rs.next()) {
    for (String column : columnsList.split(",")) {
        //check whether rs.getString(column) is a valid JSON String?
        try{ 
            parser.parse(rs.getString(column)); 
            System.out.println("Valid JSON String data");
        } catch (ParseException e) {
            System.out.printlnn("Invalid JSON String data");
        }
    }
}
person Gus    schedule 27.02.2013
comment
Я не собираюсь анализировать действительную строку JSON. Просто проверьте, является ли он действительным или нет. - person ; 28.02.2013
comment
Каково ваше определение валидности? (большинство людей считают действительным то, что его можно разобрать) - person Gus; 28.02.2013
comment
@FarhanJamal: вы должны разобрать его, чтобы узнать, действительно ли оно - person Falmarri; 28.02.2013
comment
Это также проверяет {ключ: значение}, но это не действительный json - person Pratapi Hemant Patel; 19.06.2016
comment
@HemantPatel Я предоставил решение, которое правильно определило это как недопустимый json. - person Lachlan Lindsay; 17.10.2017

Я предпочитаю использовать библиотеку Джексона, она хорошо справляется с большими файлами.

   import com.fasterxml.jackson.databind.ObjectMapper;
   import java.io.IOException;

    private Boolean isValidJson(String maybeJson){
        try {
            final ObjectMapper mapper = new ObjectMapper();
            mapper.readTree(maybeJson);
            return true;
        } catch (IOException e) {
            return false;
        }
    }

Я написал тест, чтобы проверить поведение этого подхода.

    Assert.assertThat(isValidJson("{\"token_type\":\"bearer\",\"access_token\":\"AAAA%2FAAA%3DAAAAAAAA\",\"scope\": \"scope of the token\",\"expires_in\": 200,\"refresh_token\":\"fdb8fdbecf1d03ce5e6125c067733c0d51de209c\"}"), Is.is(true));
    Assert.assertThat(isValidJson("[ \"Ford\", \"BMW\", \"Fiat\" ]\n"), Is.is(true));
    Assert.assertThat(isValidJson(""), Is.is(false));
    Assert.assertThat(isValidJson("Lachlan"), Is.is(false));
    Assert.assertThat(isValidJson("{ key: value }"), Is.is(false));

Интегрируйте это решение обратно в свой код. Я предположил, что вы поместите код проверки в тот же класс.

while (rs.next()) {
    for (String column : columnsList.split(",")) {
        String maybeJson = rs.getString(column)
        //check whether rs.getString(column) is a valid JSON String?
        if(isValidJson(maybeJson)) {
            System.out.println("Valid JSON String data")
        }
    }
}

Рассмотрите возможность добавления нулевой проверки в зависимости от того, какие значения и желаемое поведение.

person Lachlan Lindsay    schedule 17.10.2017