【问题标题】:Check whether the String is a Valid JSON String or not?检查字符串是否是有效的 JSON 字符串?
【发布时间】:2013-02-13 23:38:00
【问题描述】:

我正在尝试执行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 字符串?

有什么想法吗?

【问题讨论】:

标签: java json string resultset


【解决方案1】:

我更喜欢使用擅长处理大文件的 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")
        }
    }
}

考虑根据什么值和期望的行为添加一个空检查。

【讨论】:

    【解决方案2】:

    如果您需要确定它确实是有效的 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");
            }
        }
    }
    

    【讨论】:

    • 我不想解析有效的 JSON 字符串。只需检查它是否有效。
    • 你对有效的定义是什么? (大多数人认为有效意味着它可以被解析)
    • @FarhanJamal:你必须解析它才能知道它是否有效
    • 这也验证了 { key: value },但它不是一个有效的 json
    • @HemantPatel 我提供了一个解决方案,可以正确地将其识别为无效的 json。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2019-10-04
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多