Проверете дали низът е валиден 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

Предпочитам да използвам библиотеката Jackson, добра е при работа с големи файлове.

   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