以有效的方式解析JSON字符串

时间:2013-03-03 20:12:07

标签: 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值与上述userId中的JSON String值进行匹配。我从不同的来源获得id值。 如果id值为419,则表示上述JSON字符串userId值也应为419。在JSON字符串中,有可能存在大量userId values,因此所有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方法中,我正在重复一些我不应该做的事情。如果我错过任何东西,任何人都可以帮我解决这个问题。我将能够学到更多东西。谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

您可以初始化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;
}

这样,只有当所有数组元素都有效时才迭代遍历所有数组的元素,这是你实际需要的唯一情况。