簡體   English   中英

BufferedReader無法讀取所有JSON數據

[英]BufferedReader can't read all JSON data

我正在使用BufferedReader來獲取JSON數據,但是我只能顯示其中的一些。

使用字符集UTF-8時,我可以顯示一個車輛數據,而其他車輛僅顯示null。

使用charset ISO-8859-1時,我可以顯示兩輛車的數據。

即使我知道可用的數據,大多數數據返回的只是NULL。 例如,我只是無法顯示有關此車輛的信息: http : //apis.is/car?number=mm202,但我始終能夠顯示有關此車輛的信息: http : //apis.is/car?number=lj403

這是我的AsyncTask以獲取JSON數據:

protected class GetLicencePlateInfoTask extends AsyncTask<Void, Void, Void> {

    protected String registryNumber, number, factoryNumber, type, subType, registeredAt, status, nextCheck, pollution, weight;

    @Override
    protected Void doInBackground(Void... params) {
        // Ná í bílnúmerið úr ET
        EditText licencePlateET = (EditText) findViewById(R.id.licencePlateEditText);

        // Ná í bílnúmerið
        String licencePlate = licencePlateET.getText().toString();

        // Eyða óþarfa bilum
        licencePlate = licencePlate.trim();

        // Henda út bilum
        licencePlate = licencePlate.replace(" ", "");

        // Setja í uppercase
        licencePlate = licencePlate.toUpperCase();

        // Henda út bandstriki ef það er
        if (licencePlate.contains("-")) {
            licencePlate = licencePlate.replace("-", "");
        }

        // URL + bílnúmer
        String carUrl = "http://apis.is/car?number=" + licencePlate;

        // Virkar eins og browser
        DefaultHttpClient httpClient = new DefaultHttpClient(new BasicHttpParams());

        HttpPost httpPost = new HttpPost(carUrl);
        httpPost.setHeader("Content-type", "application/json");

        InputStream inputStream = null;

        // Geymir JSON gögnin sem við fáum til baka
        String jsonString = null;

        try {
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            // Json er UTF-8
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "ISO-8859-1"), 8);
            StringBuilder stringBuilder = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line + "\n");
            }
            jsonString = stringBuilder.toString();

            JSONObject jsonObject = new JSONObject(jsonString);
            // Ná í bílnúmer úr results array
            JSONArray resultsArray = jsonObject.getJSONArray("results");

            for (int i = 0; i < resultsArray.length(); i++) {
                try {
                    JSONObject oneObject = resultsArray.getJSONObject(i);
                    // Ná í info úr array
                    registryNumber = oneObject.getString("registryNumber");
                    number = oneObject.getString("number");
                    factoryNumber = oneObject.getString("factoryNumber");
                    type = oneObject.getString("type");
                    subType = oneObject.getString("subType");
                    registeredAt = oneObject.getString("registeredAt");
                    //status = oneObject.getString("status");
                    nextCheck = oneObject.getString("nextCheck");
                    pollution = oneObject.getString("pollution");
                    weight = oneObject.getString("weight");

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            // Log.i("registryNumber", registryNumber);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // Log.i("jsonString", jsonString);

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        displayInfoTV.setText(
            "Tegund: " + type + "\n" +
            "Undirtegund: " + subType + "\n" +
            "Skráningarnúmer: " + registryNumber + "\n" +
            "Fastanúmer: " + number + "\n" +
            "Verksmiðjunúmer: " + factoryNumber + "\n" +
            "Fyrst skráð: " + registeredAt + "\n" +
            "CO2 losun: " + pollution + "\n" +
            "Eiginþyngd: " + weight + "\n" +
            //"Staða: " + status + "\n" +
            "Næsta skoðun: " + nextCheck + "\n"
        );
    }
}

好的,我正在接近發現正在發生的事情。

StringBuilder有時會返回Cannot POST

jsonString: Cannot POST /car?number=DD550

但有時它會起作用:﹕

jsonString: {"results":[{"registryNumber":"LJ403","number":"LJ403","factoryNumber"...

有任何想法嗎?

當我使用Web瀏覽器訪問這些鏈接時,頁面信息顯示字符集為“ windows-1252”。

嘗試使用“ windows-1252”或“ Cp1252”作為InputStreamReader的字符集名稱。 通常,您可以修改代碼以從響應頭中提取要使用的字符集。 (它位於“ Content-Type”標頭中,您需要從媒體類型字符串中提取它。這是HTTP規范的示例。

Content-Type: text/html; charset=ISO-8859-4

如果此方法失敗,則應與網站所有者聯系,並告訴他們他們發送的Content-Type標頭不正確或JSON出現問題。

或者,您可以隨機嘗試Java可以理解的其他字符集。 它們在此處列出: http : //docs.oracle.com/javase/1.5.0/docs/guide/intl/encoding.doc.html

采用

BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String line = null; (line = reader.readLine()) != null;) {
    builder.append(line).append("\n");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM