2014-11-04 83 views
0

我在尝试从JSON提取值时遇到了一些问题。这里是JSON从我的servlet返回:提取JSON值

[ 
    { 
     "eventDesc":"My sons 5th year birthday party", 
     "eventDate":"12/11/2014", 
     "eventID":"1", 
     "eventName":"Birthday party", 
     "eventTime":"17:00", 
     "eventX":"41803.2", 
     "eventY":"38210.8", 
     "eventBy":"Gabriel" 
    }, 
    { 
     "eventDesc":"Steamboat Gathering", 
     "eventDate":"20/11/2014", 
     "eventID":"2", 
     "eventName":"Gathering", 
     "eventTime":"19:00", 
     "eventX":"41551.6", 
     "eventY":"38211.7", 
     "eventBy":"JunHong" 
    } 
] 

而且我不知道我应该怎么提取它每条记录的记录,因为我有每个记录绘制到地图上。

我有这些代码提取从JSON在servlet返回:

public void getThemesOnMap() throws JSONException{ 
    String page; 
    BufferedReader in; 
    JSONArray jsonArray; 

    try{ 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet("http://localhost:8080/MyProject/MyServlet"); 
     HttpResponse response = client.execute(request); 

     in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while((line = in.readLine()) != null){ 
      sb.append(line + NL); 
     } 
     in.close(); 
     page = sb.toString(); 
     System.out.println(page); 
     try{ 
      JSONObject jsonObject = new JSONObject(page); 
      jsonArray = jsonObject.getJSONArray(page); 
      int length = jsonArray.length(); 
      for(int i = 1; i < length; i++){ 
       JSONObject attribute = jsonArray.getJSONObject(i); 
       String eventName = attribute.getString("eventName"); 
       String eventX = attribute.getString("eventX"); 
       String eventY = attribute.getString("eventY"); 

       PictureMarkerSymbol graphicIcon; 
       graphicIcon = new PictureMarkerSymbol(this.getResources().getDrawable(R.drawable.busstopicon)); 
       Point p = new Point(Double.parseDouble(eventX), Double.parseDouble(eventY)); 
       Symbol symbol = graphicIcon; 

       HashMap<String, Object> attrMap = new HashMap<String, Object>(); 
       attrMap.put("eventName", eventName); 

       graphicsLayer.addGraphic(new Graphic(p, symbol, attrMap)); 
      } 
     } 
     catch(JSONException e){ 
      e.printStackTrace(); 
     } 
    } 
    catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 

但它不会绘制任何东西到地图上。有任何想法吗?

在此先感谢。

编辑

我怎么能格式化我的JSON作为返回:

{Events:[ 
{ 
    "eventDesc":"My sons 5th year birthday party", 
    "eventDate":"12/11/2014", 
    "eventID":"1", 
    "eventName":"Birthday party", 
    "eventTime":"17:00", 
    "eventX":"41803.2", 
    "eventY":"38210.8", 
    "eventBy":"Gabriel" 
}, 
{ 
    "eventDesc":"Steamboat Gathering", 
    "eventDate":"20/11/2014", 
    "eventID":"2", 
    "eventName":"Gathering", 
    "eventTime":"19:00", 
    "eventX":"41551.6", 
    "eventY":"38211.7", 
    "eventBy":"JunHong" 
}] 
} 

这是我的servlet方法从数据库中检索数据:

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    if(request.getParameter("SQL1")!=null){ 

    } 

    JSONArray jsonArray = new JSONArray(); 
    PrintWriter out = response.getWriter(); 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = DriverManager.getConnection(
       "jdbc:mysql://localhost/mydb", "root", "root"); 

     PreparedStatement statement = con 
       .prepareStatement("SELECT * FROM event"); 
     ResultSet result = statement.executeQuery(); 
     while (result.next()) { 
      JSONObject eventInfo = new JSONObject(); 
      eventInfo.put("eventID", result.getString("eventID")); 
      eventInfo.put("eventName", result.getString("eventName")); 
      eventInfo.put("eventDesc", result.getString("eventDesc")); 
      eventInfo.put("eventDate", result.getString("eventDate")); 
      eventInfo.put("eventTime", result.getString("eventTime")); 
      eventInfo.put("eventX", result.getString("eventX")); 
      eventInfo.put("eventY", result.getString("eventY")); 
      eventInfo.put("eventBy", result.getString("eventBy")); 
      jsonArray.put(eventInfo); 
     } 
    } 

    catch (JSONException je) { 
     System.out.println(je.getMessage()); 
    } catch (Exception exc) { 
     System.out.println(exc.getMessage()); 
    } 

    out.println(jsonArray.toString()); 
} 
+1

您是否考虑过使用JSON解析器? – 2014-11-04 00:36:17

+0

让我再次更新我的问题。给我5分钟:) – 2014-11-04 00:37:29

+0

首先转到json.org并研究JSON语法。学习只需要5-10分钟。然后理解JSON“对象”映射到Java地图和JSON“数组”映射到Java列表。 JSON解析器会将数据解析为地图和列表的“嵌套”以匹配原始JSON的结构。 (并且,如果您将JSON字符串粘贴到联机JSON解析器/格式化程序(如http://json.parser.online.fr/)中,则它将以更易于阅读的格式良好的样式显示。) – 2014-11-04 01:04:28

回答

1

创建JSONArray

JSONArray arr = new JSONArray("your json string here"); 

和浏览它

for (int i = 0; i < arr.length; i++) 
{ 
    JSONObject o = arr.getJSONObject(i); 
    //... 

点击此处了解详情:http://www.json.org/javadoc/index.html?org/json/JSONObject.html

编辑

这样做:

jsonArray = new JSONArray(page); 
int length = jsonArray.length(); 
for(int i = 0; i < length; i++){ 
    //... 

EDIT2

为了获得所需的JSON,这样做:

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    if(request.getParameter("SQL1")!=null){ 

    } 

    JSONObject result = new JSONObject(); 
    JSONArray jsonArray = new JSONArray(); 
    PrintWriter out = response.getWriter(); 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = DriverManager.getConnection(
       "jdbc:mysql://localhost/mydb", "root", "root"); 

     PreparedStatement statement = con 
       .prepareStatement("SELECT * FROM event"); 
     ResultSet result = statement.executeQuery(); 
     while (result.next()) { 
      JSONObject eventInfo = new JSONObject(); 
      eventInfo.put("eventID", result.getString("eventID")); 
      eventInfo.put("eventName", result.getString("eventName")); 
      eventInfo.put("eventDesc", result.getString("eventDesc")); 
      eventInfo.put("eventDate", result.getString("eventDate")); 
      eventInfo.put("eventTime", result.getString("eventTime")); 
      eventInfo.put("eventX", result.getString("eventX")); 
      eventInfo.put("eventY", result.getString("eventY")); 
      eventInfo.put("eventBy", result.getString("eventBy")); 
      jsonArray.put(eventInfo); 
     } 
     result.put("Events", (Object) jsonArray); 
    } 

    catch (JSONException je) { 
     System.out.println(je.getMessage()); 
    } catch (Exception exc) { 
     System.out.println(exc.getMessage()); 
    } 

    out.println(result.toString()); 
} 
+0

你能帮我检查我的更新部分吗?因为当我试图打印出控制台中的页面时,它是空的 – 2014-11-04 00:47:31

+0

不幸的是,没有运气。控制台仍然是空的 – 2014-11-04 00:54:58

+0

而http:// localhost:8080/MyProject/MyServlet确实在浏览器中提供了json字符串? – ToYonos 2014-11-04 00:56:47

0

,如果你想图你可能希望使用现有的JavaScript/jQuery库左右 JSON的,但你要知道我假设你想使这里创建一个时间表地图的算法:

you need to loop over dates check any event from this date from you json by looping through it if there are events then put it to the map horizontally then start the next loop to check.

希望它可以帮助

0

你有没有考虑使用日e Spring框架的RestTemplate类? 它直接将http请求与可能性约5行代码映射到pojo的可能性。好处是你知道映射工作正常,并且源代码更加可读。

帮助我很多的例子:https://spring.io/guides/gs/consuming-rest/

+0

介意给我提供一些例子吗? – 2014-11-04 01:00:54

+0

我在我的文章中添加了一个url – damare 2014-11-04 01:08:34

+0

但是,如何将其实施到我的项目中? – 2014-11-04 01:36:34