2016-11-30 66 views
0

我想实现一个Web服务,它返回一个简单的数据库从Java应用程序中读取它。JSON问题与java程序

我的服务器正在运行Tomcat 7

这里是一个应该创建我的JSON文件中的代码:

<%@ page pageEncoding="UTF-8"%> 
<%@ page import="java.sql.*" %> 
<%@page import="org.json.simple.JSONObject"%> 

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 

<link rel="icon" type="image/png" href="HilevenLogo.png" /> 

<title>Hileven</title> 
</head> 
<body> 

<% 
    Class.forName ("org.postgresql.Driver"); 

    Connection cnx = DriverManager.getConnection ("jdbc:postgresql://localhost", "user" , "password"); 

    Statement st = cnx.createStatement(); 
    ResultSet rs = st.executeQuery("SELECT id, description, libelle, ordre, warning FROM commandes ORDER BY ordre"); 

    JSONObject obj=new JSONObject(); 

    while(rs.next()){ 
     obj.put("id", new Integer(rs.getInt("id"))); 
     obj.put("description", rs.getString("description")); 
     obj.put("libelle", rs.getString("libelle")); 
     obj.put("ordre", new Integer(rs.getInt("ordre"))); 
     obj.put("warning", new Boolean(rs.getBoolean("warning"))); 

     out.print(obj); 
     out.flush(); 
    } 

    rs.close(); 
    cnx.close(); 

%> 

</body> 
</html> 

我的第一个问题是关于循环。一个JSON文件可以有多个记录吗?因为我的代码显示一个网页,如:

{“公共秩序”:1,“libelle”:“融洽每日新闻”,“说明”:“Envoie联合国关系JOURNALIER德升业务范围都serveur相提并论邮件”,”警告“:false,”id“:1} {”ordre“:2,”libelle“:”Rapport Hebdomadaire“,”description“:”Envoie un rapport hebdomadaire de lactivitédu serveur par mail“,”warning“:false ,“id”:2} {“ordre”:3,“libelle”:“Reboot”,“description”:“Redémarrele serveur”,“warning”:false,“id”:3} {“ordre”:100 ,“libelle”:“Extinction”,“description”:“Eteint le serveur”,“warning”:true,“id”:4}

With 4 {}。可能吗 ?

然后,我有我的阅读类我在这个论坛上有太多:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.URL; 
import java.nio.charset.Charset; 

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

public class JsonReader { 

    private static String readAll(Reader rd) throws IOException { 
    StringBuilder sb = new StringBuilder(); 
    int cp; 
    while ((cp = rd.read()) != -1) { 
     sb.append((char) cp); 
    } 
    return sb.toString(); 
    } 

    public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { 
    InputStream is = new URL(url).openStream(); 
    try { 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
     String jsonText = readAll(rd); 
     System.out.println(jsonText); 
     JSONObject json = new JSONObject(jsonText); 
     return json; 
    } finally { 
     is.close(); 
    } 
    } 

    public static void main(String[] args) throws IOException, JSONException { 
    JSONObject json = readJsonFromUrl("http://www.hileven.com/admin"); 
    System.out.println(json.toString()); 
    System.out.println(json.get("id")); 
    } 
} 

我有这样的错误:在线程“主要” org.json.JSONException

例外:一个JSONObject文本必须用 '{' 开始在字符6

在该行:

JSONObject json = new JSONObject(jsonText);

所以我增加了一个的System.out.println(jsonText)仅此行之前,它返回我的整个页面的HTML代码:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 

<link rel="icon" type="image/png" href="HilevenLogo.png" /> 

<title>Hileven</title> 
</head> 
<body> 

{"ordre":1,"libelle":"Rapport Quotidien","description":"Envoie un rapport journalier de l activité du serveur par mail","warning":false,"id":1}{"ordre":2,"libelle":"Rapport Hebdomadaire","description":"Envoie un rapport hebdomadaire de l activité du serveur par mail","warning":false,"id":2}{"ordre":3,"libelle":"Reboot","description":"Redémarre le serveur","warning":false,"id":3}{"ordre":100,"libelle":"Extinction","description":"Eteint le serveur","warning":true,"id":4} 

</body> 
</html> 

它是正常的吗?我认为我的JSON网络服务配置不好。当我们尝试转到URL而不是打印所有JSON内容时,是否不必开始下载JSON文件?

如何让我的JSP只返回JSON部分,甚至如何让我的Java程序只读取JSON部分而不是所有的html代码?

回答

1

问题在于JSON结构,因为它具有无效的结构。您需要用逗号分隔每个记录,,并在[]范围内包含整个JSON,因为您有符号列表。

[{"ordre":1,"libelle":"Rapport Quotidien","description":"Envoie un rapport journalier de l activité du serveur par mail","warning":false,"id":1},{"ordre":2,"libelle":"Rapport Hebdomadaire","description":"Envoie un rapport hebdomadaire de l activité du serveur par mail","warning":false,"id":2},{"ordre":3,"libelle":"Reboot","description":"Redémarre le serveur","warning":false,"id":3},{"ordre":100,"libelle":"Extinction","description":"Eteint le serveur","warning":true,"id":4}] 

您需要JSON数组以及Object(每行)。

JSONObject obj; 
JSONArray list = new JSONArray(); 

while(rs.next()){ 
    obj=new JSONObject(); 
    list.add(obj); 
    obj.put("id", new Integer(rs.getInt("id"))); 
    obj.put("description", rs.getString("description")); 
    obj.put("libelle", rs.getString("libelle")); 
    obj.put("ordre", new Integer(rs.getInt("ordre"))); 
    obj.put("warning", new Boolean(rs.getBoolean("warning"))); 
} 
out.print(list); 
out.flush(); 

也改变这一行。

JSONObject json = new JSONObject(jsonText); 

JSONArray json = new JSONArray(jsonText); 
+0

好的我在脚本的开头添加了“<%@ page trimDirectiveWhitespaces =”true“%>”,我找到了一个解决方案。感谢您的关注 ! –

1

你会发现这更容易做的杰克逊库。它将处理数组和对象格式;只需将整个数据结构(一个Java类对象的Java数组)放在一起,然后调用Jackson将其序列化。

JSONObject json = new JSONObject(jsonText); 

不会读取数组,只是单个对象。要阅读[{}, {}, ...],您需要发现读取对象数组的API。

+0

在@Arvind的帮助下,我得到了正确的结构。但我仍然从我的java程序中得到同样的错误 –

+0

看起来你正在尝试读取一个数组作为一个对象。 – bmargulies

+0

是的我修改了我的类来读取JSONArray,并且我可以用“arr.getJSONObject(index)”读取所有的JSONObject。谢谢你的帮助 ! –