java - 高效且干净地解析 JSON 字符串

标签 java json string parsing

在我下面的代码中,colData 存储 JSON String。 colData 示例示例-

{"lv":[{"v":{"price":70.0,"userId":419},"cn":3},
       {"v":{"price":149.99,"userId":419},"cn":3},
       {"v":{"price":54.95,"userId":419},"cn":3}],
 "lmd":20130206212543}

现在我尝试将 id 值与上述 JSON String 中的 userId 值匹配。我从不同来源获取 id 值。 意思是如果 id 值为 419 那么在上面的 JSON 字符串中 userId 值也应该是 419。在 JSON 字符串中,可能有很多 userId 值,因此所有 userId 值都应该与 id 匹配。如果其中任何一个不匹配,则记录异常。

所以我正在尝试这样的事情-

final int id = generateRandomId(random);

for (String str : colData) {
    if (!isJSONValid(str, id)) {
        // log the exception here
        LOG.error("Invalid JSON String " +str+ "with id" +id);
    }
}

public boolean isJSONValid(final String str, final int id) {
    boolean valid = false;
    try {
        final JSONObject obj = new JSONObject(str);
        final JSONArray geodata = obj.getJSONArray("lv");
        final int n = geodata.length();

        for (int i = 0; i < n; ++i) {
            final JSONObject person = geodata.getJSONObject(i);
            JSONObject  menu = person.getJSONObject("v");
            if(menu.getInt("userId") == id) {
                valid = true;
            }
        }
    } catch (JSONException ex) {
        valid = false;
    }
    return valid;
}

根据我的理解,我似乎可以使 isJSONValid 方法更简洁。在我上面的 isJSONValid 方法中,我重复了一些我不应该做的事情。如果我遗漏了什么,谁能帮我弄清楚如何使它更清洁。我将能够学到更多的东西。感谢您的帮助

最佳答案

你可以初始化valid = true,当你发现一个无效的userId并立即失败时将它设置为false:

public boolean isJSONValid(final String str, final int id) {
    boolean valid = true;
    try {
        final JSONObject obj = new JSONObject(str);
        final JSONArray geodata = obj.getJSONArray("lv");
        final int n = geodata.length();

        for (int i = 0; i < n; ++i) {
            final JSONObject person = geodata.getJSONObject(i);
            JSONObject  menu = person.getJSONObject("v");
            if(menu.getInt("userId") != id) {
                valid = false;
                break;
            }
        }
    } catch (JSONException ex) {
        valid = false;
    }
    return valid;
}

通过这种方式,您仅在所有元素都有效时才遍历所有数组元素,这是您实际必须这样做的唯一情况。

关于java - 高效且干净地解析 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190304/

相关文章:

java - 当 DataProvider 上的并行设置为 true 时,并行执行测试会引发异常 - TestNG

python - 将 json 字符串插入表中

java - 是否有返回请求的 Number 子类的 Java 数字字符串文字的解析器?

c - 将文本存储在 C 中的字符矩阵中

python - 在 json 文件中使用变量

regex - 如果行以关键字结尾,则将字符串添加到行前面

java - JComboBox getSelectedIndex 不工作两次?

java - 网格中具有固定大小的组件

java - Spring data gemfire 不支持 REQUIRES_NEW 事务

java - 使用 Jackson 序列化和反序列化针对 JAVA 类的 JSON