0

如何使用 servlet 创建像此代码(见下文)的 JSON 数组?现在我在 String 中手动编写代码并将其转换为 JSON 数组,但我总是得到一个错误:

错误:

Error parsing data org.json.JSONException: Expected literal value at character 982 of


{
    "question": [
        {
            "text": "",
            "answers": [  { "a1": "" }, { "a2": "" }, { "a3": "" } ],
            "correctAnswers": [ { "ra1": "" }, { "ra2": ""  }, { "ra3": "" } ],
            "explanation": ""
        },
    .
    .
    .
    ]
}

这是 servlet 代码:有些部分是德文的,如果您在理解上有问题,请见谅

StringBuffer sb = new StringBuffer();
        ArrayList<Integer> kapitel = new ArrayList<Integer>();

        String text = "false";
        // boolean check = false;

        for (int i = 0; i < 14; i++) {
            if ("1".equals(request.getParameter("k" + (i + 1))))
                kapitel.add(i + 1);
        }


        String arrayFragen[][] = null;
        String arrayAntworten[][] = null;
        String[] antwortSeatze = null;
        String[] richtigeAntwortSeatze = null;

        Main main = new Main();
        Datenbank db = new Datenbank();

        main.frageAntworten(kapitel);


        arrayAntworten = main.antworten;
        arrayFragen = main.fragen;

        int zeahler = 1;
        String frageId;
        sb.append("{");
        sb.append("\n\"frage\": [");

        for (int i = 0; i < arrayFragen.length - 1; i++) {
            frageId = arrayFragen[i][0];

            sb.append("\n{");
            sb.append("\n\"text\": \"" + arrayFragen[i][1] + "\", ");
            sb.append("\n\"antworten\": [");

            antwortSeatze = new String[db.arraySizeAntwortenSeatze(frageId,
                    arrayAntworten)];
            int x = 0;
            for (int j = 0; j < arrayAntworten.length; j++) {
                if (arrayAntworten[j][0].equals(frageId))
                    antwortSeatze[x++] = arrayAntworten[j][1];
            }
            zeahler = 1;
            for (int j = 0; j < antwortSeatze.length - 1; j++) {
                sb.append("\n{\"a" + zeahler++ + "\": \"" + antwortSeatze[j]
                        + "\"}, ");
            }

            // letze Antwortmöglichkeit
            sb.append("\n{\"a" + zeahler++ + "\": \""
                    + antwortSeatze[antwortSeatze.length - 1] + "\"} ");
            sb.append("\n],");

            richtigeAntwortSeatze = new String[db.arraySizeAntwortenSeatze(
                    frageId, arrayAntworten)];

            // Richige Antworten
            sb.append("\n\"richtigeantworten\": [");
            antwortSeatze = new String[db.arraySizeAntwortenSeatze(frageId,
                    arrayAntworten)];
            int y = 0;
            for (int j = 0; j < richtigeAntwortSeatze.length; j++) {
                if (arrayAntworten[j][0].equals(frageId))
                    if (arrayAntworten[j][2].equals("false"))
                        antwortSeatze[y++] = "null";
                if (!(arrayAntworten[j][2].equals("false")))
                    antwortSeatze[y++] = arrayAntworten[j][1];
            }
            zeahler = 1;
            for (int j = 0; j < antwortSeatze.length - 1; j++) {
                sb.append("\n{\"ra" + zeahler++ + "\": \"" + antwortSeatze[j]
                        + "\"}, ");

                // letze Richtige Antwortmöglichkeit
            }
            sb.append("\n{\"ra" + zeahler++ + "\": \""
                    + antwortSeatze[antwortSeatze.length - 1] + "\"} ");
            sb.append("\n],");

            richtigeAntwortSeatze = new String[db.arraySizeAntwortenSeatze(
                    frageId, arrayAntworten)];

            sb.append("\n\"erklaerung\": \"" + arrayFragen[i][2] + "\", ");
            sb.append("\n},");
        }

        // Letzte Frage
        frageId = arrayFragen[arrayFragen.length - 1][0];

        sb.append("\n{");
        sb.append("\n\"text\": \"" + arrayFragen[arrayFragen.length - 1][1]
                + "\", ");
        sb.append("\n\"antworten\": [");

        antwortSeatze = new String[db.arraySizeAntwortenSeatze(frageId,
                arrayAntworten)];
        int x = 0;
        for (int j = 0; j < arrayAntworten.length; j++) {
            if (arrayAntworten[j][0].equals(frageId))
                antwortSeatze[x++] = arrayAntworten[j][1];
        }
        zeahler = 1;
        for (int j = 0; j < antwortSeatze.length - 1; j++) {
            sb.append("\n{\"a" + zeahler++ + "\": \"" + antwortSeatze[j] + "\"},");
        }
        // letze Antwort möglichkeit
        sb.append("\n{\"a" + zeahler++ + "\": \""
                + antwortSeatze[antwortSeatze.length - 1] + "\"} ");
        sb.append("\n],");

        richtigeAntwortSeatze = new String[db.arraySizeAntwortenSeatze(frageId,
                arrayAntworten)];

        sb.append("\n\"richtigeantworten\": [");
        antwortSeatze = new String[db.arraySizeAntwortenSeatze(frageId,
                arrayAntworten)];
        int y = 0;
        for (int j = 0; j < richtigeAntwortSeatze.length; j++) {
            if (arrayAntworten[j][0].equals(frageId))
                if (arrayAntworten[j][2].equals("false"))
                    antwortSeatze[y++] = "null";
            if (!(arrayAntworten[j][2].equals("false")))
                antwortSeatze[y++] = arrayAntworten[j][1];
        }
        zeahler = 1;
        for (int j = 0; j < antwortSeatze.length - 1; j++) {
            sb.append("\n{\"ra" + zeahler++ + "\": \"" + antwortSeatze[j]
                    + "\" },");
        }

        // letze Richtige Antwortmöglichkeit
        sb.append("\n{\"ra" + zeahler++ + "\": \""
                + antwortSeatze[antwortSeatze.length - 1] + "\"} ");
        sb.append("\n],");

        richtigeAntwortSeatze = new String[db.arraySizeAntwortenSeatze(frageId,
                arrayAntworten)];

        sb.append("\n\"erklaerung\": \"" + arrayFragen[arrayFragen.length - 1][2]
                + "\", ");
        sb.append("\n}");

        sb.append("\n]");
        sb.append("\n}");

        text = sb.toString();


        response.getWriter().print(text);
        System.out.println(text);

安卓部分:

private  class JSONParser extends AsyncTask<URL, String, String> {

        @Override
        protected String doInBackground(URL... url) {
            InputStream is = null;
            String json = "";

            // VERBINDUNGSAUFBAU
            try {
                URLConnection connection = url[0].openConnection();
                HttpURLConnection http = (HttpURLConnection)connection;
                int response = http.getResponseCode();
                if (response == HttpURLConnection.HTTP_OK) {
                is = http.getInputStream();}


            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            // CONVERTIERUNG VON INPUTSTREAM ZU STRING

            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
            return json;


//          InputStream is =  m.getData(url[0]);
//          String json = m.InputstreamToString(is);
//          return json;
        }

        protected void onPostExecute(String json) {
             TextView fragenNr = (TextView)
            findViewById(R.id.FragenText);
             fragenNr.setText(json);


            JSONObject jObj = null;
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            try {

                frage = jObj.getJSONArray(TAG_FRAGE);



                for (int i = 0; i < frage.length(); i++) {
                    JSONObject f = frage.getJSONObject(i);

                    // Storing each json item in variable
                    String text = f.getString(TAG_TEXT);
                    String erklaerung = f.getString(TAG_ERKLAERUNG);

                    HashMap<String, Object> map = new HashMap<String, Object>();
                    map.put(TAG_TEXT, text);
                    map.put(TAG_ERKLAERUNG, erklaerung);

                    ArrayList<String> antwortenArray = new ArrayList<String>();

                    JSONArray antworten = f.getJSONArray(TAG_ANTWORTEN);
                    for (int j = 0; j < antworten.length(); j++) {
                        JSONObject a = antworten.getJSONObject(j);
                        String tag = TAG_ANTWORTEN_a + (j + 1);
                        antwortenArray.add(a.getString(tag));
                        map.put(tag, antwortenArray.get(j));

                    }

                    map.put("anzahlAntworten", antworten.length());

                    ArrayList<String> richtigeantwortenArray = new ArrayList<String>();
                    JSONArray richtigeantworten = f
                            .getJSONArray(TAG_RICHTIGEANTWORTEN);
                    for (int k = 0; k < richtigeantworten.length(); k++) {
                        JSONObject ra = richtigeantworten.getJSONObject(k);
                        String tag = TAG_RICHTIGEANTWORTEN_ra + (k + 1);
                        richtigeantwortenArray.add(ra.getString(tag));
                        map.put(tag, richtigeantwortenArray.get(k));

                    }
                    map.put("anzahlRichtigerAntworten",richtigeantworten.length());
                    fragenUndAntworten.add(map);
                    fragenListe.add(text);

                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            View weiterButton = findViewById(R.id.weiterButton);
            weiterButton.setOnClickListener(Fragen.this);
            weiterButton.performClick();

        }

    }
4

2 回答 2

2

不要尝试自己生成 JSON。生成数据结构,并使用 JSON 解析器/生成器将该数据结构实际转换为 JSON 字符串。生成器将负责为您转义字符。有几十个免费的 JSON API。有关列表,请参见http://json.org/

于 2013-01-27T14:35:51.957 回答
-2

使用 json.jar 创建 json 对象或数组...它具有创建和处理 json 的方法...

于 2013-01-27T14:15:06.317 回答