如何使用Java解析Json?

如何使用Java解析Json?,java,arrays,json,Java,Arrays,Json,我想用java解析一个json对象。json文件是{“l1”:“1”,“l2”:“0”,“f1”:“0”,“connected”:“0”,“all”:“0”} 我正试图编写一个java程序,将上面的json打印为 l1=1 l2=0 f1=0 connected=0 all=0 json文件中的条目数量可以增加,因此我必须循环json并打印所有数据。这就是我到目前为止所做的 public class main { public static void main(String[] arg

我想用java解析一个json对象。json文件是
{“l1”:“1”,“l2”:“0”,“f1”:“0”,“connected”:“0”,“all”:“0”}
我正试图编写一个java程序,将上面的json打印为

l1=1
l2=0
f1=0
connected=0
all=0
json文件中的条目数量可以增加,因此我必须循环json并打印所有数据。这就是我到目前为止所做的

public class main {
    public static void main(String[] args){
        try{
            URL url = new URL("http://localhost/switch.json");
            JSONTokener tokener = new JSONTokener(url.openStream());
            JSONObject root = new JSONObject(tokener);
            JSONArray jsonArray = root.names();
            if (jsonArray != null) { 
               int len = jsonArray.length();
               for (int i=0;i<len;i++){ 
                  System.out.println(jsonArray.get(i).toString());
               } 
            }   
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error Occured");
        }
    }
}
公共类主{
公共静态void main(字符串[]args){
试一试{
URL=新URL(“http://localhost/switch.json");
JSONTokener tokener=新的JSONTokener(url.openStream());
JSONObject根=新的JSONObject(标记器);
JSONArray JSONArray=root.names();
如果(jsonArray!=null){
int len=jsonArray.length();

对于(int i=0;i它是简单的JSON对象,不是数组。您需要迭代键并打印数据:

    JSONObject root = new JSONObject(tokener);
    Iterator<?> keys = root.keys();

    while(keys.hasNext()){
        String key = (String)keys.next();
        System.out.println(key + "=" + root.getString(key));
    }
JSONObject root=新的JSONObject(标记器);
迭代器keys=root.keys();
while(keys.hasNext()){
字符串键=(字符串)键。下一步();
System.out.println(key+“=”+root.getString(key));
}

请注意,由于内部使用了
HashMap
,上述解决方案以随机顺序打印密钥。请参阅描述此行为。

您的JSON文件不包含数组-它包含对象

JSON数组用括号括起来;JSON对象用括号括起来

[1, 2, 3]                     // array
{ one:1, two:2, three:3 }     // object
您的代码当前从该对象中提取名称,然后打印出来:

JSONObject root = new JSONObject(tokener);
JSONArray jsonArray = root.names();
您需要使用名称(键)从对象中提取每个值,而不仅仅是名称:

JSONObject root = new JSONObject(tokener);
for (Iterator<?> keys= root.keys(); keys.hasNext();){
  System.out.println(key + "=" + root.get(keys.next()));
}
JSONObject root=新的JSONObject(标记器);
for(迭代器keys=root.keys();keys.hasNext();){
System.out.println(key+“=”+root.get(key.next());
}
请注意,条目不会按任何特定顺序打印,因为它们不是按顺序打印的:

对象是一组无序的名称/值对--


另请参见JSONObject类的。我正在使用json.org中的库。为我们展示这样一个json数组的示例。现在您解析的是一个对象,而不是一个数组。为我们展示用于解析对象数组的代码。我只想解析这个{“l1”:“1”、“l2”:“0”、“f1”:“0”、“已连接”:“0”、“所有”:“0”}。我已经添加了问题中使用的代码。如果它以
{
开头,以
}
结尾,则这是一个JavaScript/JSON对象,而不是数组;JavaScript数组使用
[
]
,不需要使用
来分隔键和值。很抱歉,我编辑了这个问题。错误:只能在数组或任何实例或java.lang.iterableWhy数组以随机顺序打印?我得到的输出为connected=0 all=0 l1=1 l2=1 f1=0,因为值在内部存储在哈希映射中,所以键没有顺序。错误:只能迭代一个数组或任何实例或java.lang.iterableIt是同一个错误,但我直到后来才看到你的答案,太晚了,无法避免!可惜库没有实现Iterable。。。