检查字符串是否为合法的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字符串?

任何想法吗?

如果您需要确保它确实是有效的JSON,您将需要解析它。我喜欢的一个快速、简单、轻量级的解析器是json-simple。请看他们的例子。

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

我更喜欢使用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")
        }
    }
}

考虑根据值和期望的行为添加空检查

相关内容

  • 没有找到相关文章

最新更新