69

2 つの JSON 配列を含む JSON ファイルがあります。1 つはルート用の配列、もう 1 つは観光スポット用の配列です。

ルートは、ユーザーがナビゲートされるいくつかのサイトで構成されている必要があります。残念ながら、私はエラーが発生しています:

JSONException: java.lang.String 型の値を JSONObject に変換できません

これが私の変数とJSONファイルを解析するコードです:

private InputStream is = null;
private String json = "";
private JSONObject jObj = null;

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 + "\n");
    }
    is.close();
    // hier habe ich das JSON-File als String
    json = sb.toString();
    Log.i("JSON Parser", json);
} catch (Exception e) {
    Log.e("Buffer Error", "Error converting result " + e.toString());
}

// try parse the string to a JSON object
try {
    jObj = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON Parser", "Error parsing data " + e.toString());
}

// return JSON String
return jObj;
}

Log.i("JSON パーサー", json); 生成された文字列の先頭に奇妙な兆候があることを示しています。ここに画像の説明を入力

しかし、ここでエラーが発生します:

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

04-22 14:01:05.043: E/JSON Parser(5868): データ org.json.JSONException の解析中にエラーが発生しました: 値 //STRANGE SIGN HERE // タイプ java.lang.String を JSONObject に変換できません

JSONObject を作成するために、これらの兆候を取り除く方法を知っている人はいますか?

4

14 に答える 14

47

理由は、文字列を構成するときに不要な文字が追加されたためです。一時的な解決策は

return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));

ただし、ソース文字列の隠し文字を削除してみてください。

于 2013-03-18T04:45:53.503 に答える
41

これを参照して ください http://stleary.github.io/JSON-java/org/json/JSONObject.html#JSONObject-java.lang.String-

JSONObject

public JSONObject(java.lang.String source)
           throws JSONException

ソース JSON テキスト文字列から JSONObject を構築します。これは、最も一般的に使用される `JSONObject コンストラクターです。

Parameters:
    source - `A string beginning with { (left brace) and ending with } (right brace).` 
Throws:
    JSONException - If there is a syntax error in the source string or a duplicated key.

次のようなものを使用しようとします:

new JSONObject("{your string}")
于 2012-04-22T12:41:46.570 に答える
20

数日間同じ問題がありました。ついに解決策を見つけました。PHP サーバーは、LOG または System.out で確認できないいくつかの目に見えない文字を返しました。

したがって、解決策は、json文字列を1つずつサブストリング化しようとしたことで、substring(3)に来たときにエラーがなくなりました。

ところで。両側でUTF-8エンコーディングを使用しました。PHP側:header('Content-type=application/json; charset=utf-8');

JAVA 側:BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);

だから、解決策を1つずつ試してください 1,2,3,4...! 皆さんのお役に立てば幸いです!

try {
            jObj = new JSONObject(json.substring(3));
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data [" + e.getMessage()+"] "+json);
        }
于 2012-07-31T06:51:12.057 に答える
9

これは私のために働いた

json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
于 2015-09-07T03:23:33.837 に答える
5

問題は、使用しようとしている文字セットにある可能性があると思います。iso-8859-1 の代わりに UTF-8 を使用することをお勧めします。

また、InputStream に使用されているファイルを開き、特殊文字が誤って挿入されていないことを確認してください。隠し文字や特殊文字を表示するようにエディタに明確に指示する必要がある場合があります。

于 2012-04-23T22:45:48.450 に答える
4
return response;

その後、これを解析するために必要な応答を取得します。

JSONObject myObj=new JSONObject(response);

応答では、二重引用符は必要ありません。

于 2015-05-08T16:07:20.263 に答える
3

私はこの変更を行いましたが、今ではうまくいきます。

//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
于 2013-12-03T10:41:25.467 に答える
2

JSON 文字列の先頭にある 3 文字は、バイト オーダー マスク (BOM) に対応します。これは、ファイルを UTF8 ファイルとして識別するための一連のバイトです。

json を送信するファイルがutf8 (bom なし)エンコーディングでエンコードされていることを確認してください。

(TextWranglerエディタで同じ問題がありました。正しいエンコーディングを強制するには、save as - utf8(bomなし)を使用してください。)

それが役に立てば幸い。

于 2013-07-16T09:19:28.460 に答える
2

私の場合、問題はphpファイルから発生しました。不要な文字が表示されたため、json parsing問題が発生しました。

次に、貼り付けてタブ から選択php codeし、このコードを実行します-Notepad++Encode in utf-8 without BOMEncoding

私の問題はなくなりました。

于 2015-07-14T05:49:31.760 に答える
2

私の場合、私の Android アプリは Volley を使用して、Microsoft Azure でホストされている API アプリケーションに対して、本文が空の POST 呼び出しを行います。

エラーは次のとおりです。

JSONException: Value <p>iisnode of type java.lang.String cannot be converted to JSONObject

これは、Volley JSON リクエストを作成する方法のスニペットです。

final JSONObject emptyJsonObject = new JSONObject();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, emptyJsonObject, listener, errorListener);

JSONObject次のように、空の JSON オブジェクトを使用してを作成することで問題を解決しました。

final JSONObject emptyJsonObject = new JSONObject("{}");

私の解決策は、この古い回答に沿っています。

于 2016-10-24T18:15:56.077 に答える