在Java中解析JSON字符串

83

我正在尝试在Java中解析JSON字符串,以单独打印各个值。但在运行程序时,我遇到了以下错误-

Exception in thread "main" java.lang.RuntimeException: Stub!
       at org.json.JSONObject.<init>(JSONObject.java:7)
       at ShowActivity.main(ShowActivity.java:29)

我的类的样子是这样的 -

import org.json.JSONException;
import org.json.JSONObject;

public class ShowActivity {
   private final static String  jString = "{" 
   + "    \"geodata\": [" 
   + "        {" 
   + "                \"id\": \"1\"," 
   + "                \"name\": \"Julie Sherman\","                  
   + "                \"gender\" : \"female\"," 
   + "                \"latitude\" : \"37.33774833333334\"," 
   + "                \"longitude\" : \"-121.88670166666667\""            
   + "                }" 
   + "        }," 
   + "        {" 
   + "                \"id\": \"2\"," 
   + "                \"name\": \"Johnny Depp\","          
   + "                \"gender\" : \"male\"," 
   + "                \"latitude\" : \"37.336453\"," 
   + "                \"longitude\" : \"-121.884985\""            
   + "                }" 
   + "        }" 
   + "    ]" 
   + "}"; 
   private static JSONObject jObject = null;

   public static void main(String[] args) throws JSONException {
       jObject = new JSONObject(jString);
       JSONObject geoObject = jObject.getJSONObject("geodata");

       String geoId = geoObject.getString("id");
           System.out.println(geoId);

       String name = geoObject.getString("name");
       System.out.println(name);

       String gender=geoObject.getString("gender");
       System.out.println(gender);

       String lat=geoObject.getString("latitude");
       System.out.println(lat);

       String longit =geoObject.getString("longitude");
       System.out.println(longit);                   
   }
}

请告诉我我缺少了什么,或者每次运行应用程序时都会出现错误的原因。欢迎任何评论。


2
android.jar 只包含用于编译的存根。要运行,您需要完整的库。 - obataku
是的,我在我的项目中导入了 android.jar。你能告诉我从哪里下载完整的库吗? - AKIWEB
7个回答

97
请查看我的评论。 当运行在android.jar中时,您需要包含完整的org.json库,因为它只包含用于编译的存根。
另外,您必须删除JSON数据中longitude后面的两个额外的}实例。
   private final static String JSON_DATA =
     "{" 
   + "  \"geodata\": [" 
   + "    {" 
   + "      \"id\": \"1\"," 
   + "      \"name\": \"Julie Sherman\","                  
   + "      \"gender\" : \"female\"," 
   + "      \"latitude\" : \"37.33774833333334\"," 
   + "      \"longitude\" : \"-121.88670166666667\""
   + "    }," 
   + "    {" 
   + "      \"id\": \"2\"," 
   + "      \"name\": \"Johnny Depp\","          
   + "      \"gender\" : \"male\"," 
   + "      \"latitude\" : \"37.336453\"," 
   + "      \"longitude\" : \"-121.884985\""
   + "    }" 
   + "  ]" 
   + "}"; 

除此之外,geodata 实际上不是一个 JSONObject 而是一个 JSONArray

这是经过完全测试和修正的代码:

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ShowActivity {


  private final static String JSON_DATA =
     "{" 
   + "  \"geodata\": [" 
   + "    {" 
   + "      \"id\": \"1\"," 
   + "      \"name\": \"Julie Sherman\","                  
   + "      \"gender\" : \"female\"," 
   + "      \"latitude\" : \"37.33774833333334\"," 
   + "      \"longitude\" : \"-121.88670166666667\""
   + "    }," 
   + "    {" 
   + "      \"id\": \"2\"," 
   + "      \"name\": \"Johnny Depp\","          
   + "      \"gender\" : \"male\"," 
   + "      \"latitude\" : \"37.336453\"," 
   + "      \"longitude\" : \"-121.884985\""
   + "    }" 
   + "  ]" 
   + "}"; 

  public static void main(final String[] argv) throws JSONException {
    final JSONObject obj = new JSONObject(JSON_DATA);
    final JSONArray geodata = obj.getJSONArray("geodata");
    final int n = geodata.length();
    for (int i = 0; i < n; ++i) {
      final JSONObject person = geodata.getJSONObject(i);
      System.out.println(person.getInt("id"));
      System.out.println(person.getString("name"));
      System.out.println(person.getString("gender"));
      System.out.println(person.getDouble("latitude"));
      System.out.println(person.getDouble("longitude"));
    }
  }
}

以下是输出结果:

C:\dev\scrap>java -cp json.jar;. ShowActivity
1
Julie Sherman
female
37.33774833333334
-121.88670166666667
2
Johnny Depp
male
37.336453
-121.884985

谢谢Veer。我打开了那个链接,但是我找不到要下载的jar文件。你能告诉我具体的位置在哪里吗? - AKIWEB
3
请尝试在这里下载:http://repo1.maven.org/maven2/org/json/json/20090211/json-20090211.jar。 - obataku
我按照你的建议做了。我下载了jar文件,也将其导入到我们的项目中。当我运行我的项目时,出现了异常- Exception in thread "main" org.json.JSONException: JSONObject["geodata"] is not a JSONObject. at org.json.JSONObject.getJSONObject(JSONObject.java:596) at com.niharika.testing.JsonTest.main(JsonTest.java:31) 如果有任何想法,将不胜感激。 - AKIWEB
@Nevzz03 没问题,伙计!很高兴我能帮到你 :-) 注意,在通过 Android 部署时,您不需要 json.jar - obataku
2
org.json的链接已经失效。不过,这个示例同样适用于JSON-Java。我只需要按照所引用的包要求,将文件移动到一个新创建的文件夹org/json/中即可。 - Monkey Supersonic
显示剩余2条评论

6
要将JSON字符串转换为哈希图,您可以使用以下方法:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(response)) ;

使用这个类 :)(处理甚至是列表,嵌套列表和json)
public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}


这是非常有用的代码片段,感谢您的贡献! - MaVRoSCy

4

感谢这篇博客提供的灵感。

下面是你的Json字符串:

 {
"pageNumber":20,
"pageTitle":"example page title",
"pageInfo": {
        "pageName": "Homepage",
        "logo": "https://www.example.com/logo.jpg"
},
"posts": [
        {
            "post_id": "0123456789",
            "actor_id": "1001",
            "author_name": "Jane Doe",
            "post_title": "How to parse JSON in Java",
            "comments": [],
            "time_of_post": "1234567890"
        }
    ]
}

这是如何阅读它的方法

 import org.json.JSONArray;
 import org.json.JSONObject;

 public class ParseJSON {
 static String json = "...";
 public static void main(String[] args) {

    JSONObject obj = new JSONObject(json);
    String pageTitle = obj.getString("pageTitle");
    String pageNumber= obj.getInt("pageNumber");
    String pageName =      obj.getJSONObject("pageInfo").getString("pageName");

    System.out.println(pageNumber);
    System.out.println(pageTitle );
    System.out.println(pageName);

    JSONArray arr = obj.getJSONArray("posts");
    for (int i = 0; i < arr.length(); i++) {
        String post_id = arr.getJSONObject(i).getString("post_id");
        System.out.println(post_id);
    }
  }
}

3

看起来你的两个对象(在数组内部)都在“Longitude”后面有一个额外的闭合括号。


2
这是一个对象的示例,针对您的情况,您需要使用JSONArray。
public static final String JSON_STRING="{\"employee\":{\"name\":\"Sachin\",\"salary\":56000}}";  
try{  
   JSONObject emp=(new JSONObject(JSON_STRING)).getJSONObject("employee");  
   String empname=emp.getString("name");  
   int empsalary=emp.getInt("salary");  

   String str="Employee Name:"+empname+"\n"+"Employee Salary:"+empsalary;  
   textView1.setText(str);  

}catch (Exception e) {e.printStackTrace();}  
   //Do when JSON has problem.
}

我没有时间,但是尝试给出一个想法。如果你仍然不能做到,那么我会提供帮助。


2

首先,在每个 数组对象 后面都有一个额外的 }

其次,“geodata”是一个 JSONArray。因此,你需要使用 JSONArray geoObject = jObject.getJSONArray("geodata"); 来获取它,而不是 JSONObject geoObject = jObject.getJSONObject("geodata");

一旦你有了 JSONArray,你可以使用 geoObject.get(<index>) 来获取 JSONArray 中的每个条目。

我正在使用 org.codehaus.jettison.json


1

每个对象中都有一个额外的"}",您可以像这样编写JSON字符串:

public class ShowActivity {   
    private final static String  jString = "{" 
    + "    \"geodata\": [" 
    + "        {" 
    + "                \"id\": \"1\"," 
    + "                \"name\": \"Julie Sherman\","                  
    + "                \"gender\" : \"female\"," 
    + "                \"latitude\" : \"37.33774833333334\"," 
    + "                \"longitude\" : \"-121.88670166666667\""            
    + "                }" 
    + "        }," 
    + "        {" 
    + "                \"id\": \"2\"," 
    + "                \"name\": \"Johnny Depp\","          
    + "                \"gender\" : \"male\"," 
    + "                \"latitude\" : \"37.336453\"," 
    + "                \"longitude\" : \"-121.884985\""            
    + "                }" 
    + "        }" 
    + "    ]" 
    + "}"; 
}

@Nevzz03 你可以使用 链接 flexjson Java 库来创建你的 JSON 对象。 - Prog Mania

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接