Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 高效且干净地解析JSON字符串_Java_Json_String_Parsing - Fatal编程技术网

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实际上,你比我更准确:)。谢谢大家的建议。谢谢你的帮助。