web-dev-qa-db-ja.com

JSONException:タイプJava.lang.Stringの値はJSONObjectに変換できません

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 Parser"、json);生成された文字列の先頭に奇妙な兆候があることを示しています: enter image description here

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

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を作成するためにこれらの兆候を取り除く方法について誰かが手がかりを持っていますか?

57
RCK69

これを参照してください 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}")
35
Zaz Gmy

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

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

ただし、ソース文字列の非表示文字を削除してください。

38
khaintt

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

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

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

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

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

try {
            jObj = new JSONObject(json.substring(3));
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data [" + e.getMessage()+"] "+json);
        }
15
MTurPash

以下に、UTF-8バージョンをいくつかの例外処理とともに示します。

static InputStream is = null;
static JSONObject jObj = null;
static String json = null;
static HttpResponse httpResponse = null;

public JSONObject getJSONFromUrl(String url) {
    // Making HTTP request
    try {
        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, true);
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient(params);
        HttpGet httpPost = new HttpGet( url);
        httpResponse = httpClient.execute( httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           
    } catch (UnsupportedEncodingException ee) {
        Log.i("UnsupportedEncodingException...", is.toString());
    } catch (ClientProtocolException e) {
        Log.i("ClientProtocolException...", is.toString());
    } catch (IOException e) {
        Log.i("IOException...", is.toString());
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8); //old charset iso-8859-1
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        reader.close();
        json = sb.toString();
        Log.i("StringBuilder...", 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 (Exception e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
        try {
            jObj = new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
        } catch (Exception e0) {
            Log.e("JSON Parser0", "Error parsing data [" + e0.getMessage()+"] "+json);
            Log.e("JSON Parser0", "Error parsing data " + e0.toString());
            try {
                jObj = new JSONObject(json.substring(1));
            } catch (Exception e1) {
                Log.e("JSON Parser1", "Error parsing data [" + e1.getMessage()+"] "+json);
                Log.e("JSON Parser1", "Error parsing data " + e1.toString());
                try {
                    jObj = new JSONObject(json.substring(2));
                } catch (Exception e2) {
                    Log.e("JSON Parser2", "Error parsing data [" + e2.getMessage()+"] "+json);
                    Log.e("JSON Parser2", "Error parsing data " + e2.toString());
                    try {
                        jObj = new JSONObject(json.substring(3));
                    } catch (Exception e3) {
                        Log.e("JSON Parser3", "Error parsing data [" + e3.getMessage()+"] "+json);
                        Log.e("JSON Parser3", "Error parsing data " + e3.toString());
                    }
                }
            }
        }
    }

    // return JSON String
    return jObj;

}
7
izbrannick

これは簡単な方法です(Gsonに感謝)

JsonParser parser = new JsonParser();
String retVal = parser.parse(param).getAsString();

https://Gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem

5
Mustafa Ferhan

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

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

4
Nic Raboy

これは私のために働いた

json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
3
Alex Escobar
return response;

その後、応答を取得して、これを解析する必要があります。

JSONObject myObj=new JSONObject(response);

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

3
user4879711

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

//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
2
Jamal

私の場合、私の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);

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

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

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

1
Pablo Carbajal

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

Jsonを送信するファイルがtf8(no bom) encodingでエンコードされていることを確認してください。

(TextWranglerエディターで同じ問題が発生しました。save as-tf8(no bom)を使用して正しいエンコードを強制します)

それが役に立てば幸い。

1
stevenwood

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

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

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

1

if キーの値 iscoming asStringそれをJSONObjectに変換したい

まず、key.valueを次のようなString変数に入れます

 String data = yourResponse.yourKey;

次にJSONArrayに変換します

JSONObject myObj=new JSONObject(data);
0
Thunder