Java 高效且干净地解析JSON字符串
在我下面的代码中,Java 高效且干净地解析JSON字符串,java,json,string,parsing,Java,Json,String,Parsing,在我下面的代码中,colData存储JSON字符串。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字符串中的userId值进行匹配。我
colData
存储JSON字符串
。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字符串中的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;
}
final int id=generateRandomId(随机);
for(字符串str:colData){
如果(!isJSONValid(str,id)){
//在此处记录异常
LOG.error(“id为“+id”的无效JSON字符串“+str+”);
}
}
公共布尔值isJSONValid(最终字符串str,最终int-id){
布尔有效=假;
试一试{
最终JSONObject对象=新JSONObject(str);
最终JSONArray地理数据=对象getJSONArray(“lv”);
final int n=geodata.length();
对于(int i=0;i
根据我的理解,看起来我可以使isJSONValid
方法更干净。在我上面的isJSONValid
方法中,我重复了一些我不应该做的事情。如果我遗漏了什么,有谁能帮我弄清楚如何让这更干净。我会学到更多的东西。感谢您的帮助当您发现无效的用户ID
并立即失败时,您可以初始化valid=true
,并将其设置为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;
}
public boolean isJSONValid(最终字符串str,最终int-id){
布尔有效=真;
试一试{
最终JSONObject对象=新JSONObject(str);
最终JSONArray地理数据=对象getJSONArray(“lv”);
final int n=geodata.length();
对于(int i=0;i
通过这种方式,只有当所有元素都有效时,才能遍历所有数组元素,这是您实际需要的唯一情况。您只需要一个匹配项就可以使其变好,还是只需要一个不匹配项就可以使其变差?如果是前者,则在将valid设置为true后,中断
。如果是后者,在第一次设置无效后,您需要反转有效(和If测试)和中断的感觉。一旦发现任何不匹配,我需要记录异常。我对你描述的方式感到困惑。你能举例说明吗?谢谢你的帮助。想想看——如果你要求所有东西都匹配,那么第一个不匹配意味着你可以退出并报告“坏”。如果你一直坚持下去,那就“好”。谢谢你的建议。现在有道理了。除此之外,我的代码中的所有内容看起来都很好?意思是我所做的一切都是对的?正如我所想,我在这里重复了几行代码。@Nevzz03我没有看到任何重复的代码行。。。在你的代码中,我唯一要改变的是使用String.format来记录excepion,也许可以从字符串中创建常量,比如userId
、v
和lv
,除了多次使用getJSONObject
之外,我看不到任何重复的行,但你可以将它用于JSON中的特定属性。除非这是为一般JSON查询指定的实用方法,否则您的代码看起来非常简单。阅读一次你的代码(以及你的doumentation(-;)就可以让它变得非常干净。@dantuch实际上,你比我更准确:)。谢谢大家的建议。谢谢你的帮助。