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);生成された文字列の先頭に奇妙な兆候があることを示しています:
しかし、エラーはここで発生します:
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を作成するためにこれらの兆候を取り除く方法について誰かが手がかりを持っていますか?
これを参照してください 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}")
理由は、文字列を作成するときに不要な文字が追加されたためです。一時的な解決策は
return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
ただし、ソース文字列の非表示文字を削除してください。
数日間同じ問題がありました。 最後に解決策が見つかりました。 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);
}
以下に、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;
}
これは簡単な方法です(Gsonに感謝)
JsonParser parser = new JsonParser();
String retVal = parser.parse(param).getAsString();
https://Gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem
問題は、使用しようとしている文字セットにある可能性があると思います。 iso-8859-1の代わりにUTF-8を使用することをお勧めします。
また、InputStreamに使用されているファイルを開き、誤って特殊文字が挿入されていないことを確認します。非表示/特殊文字を表示するようにエディターに明確に指示する必要がある場合があります。
これは私のために働いた
json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
return response;
その後、応答を取得して、これを解析する必要があります。
JSONObject myObj=new JSONObject(response);
応答時に、二重引用符は必要ありません。
私はこの変更を行いましたが、今ではうまくいきます。
//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
私の場合、私の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("{}");
私の解決策は、 この古い答え への線に沿っています。
JSON文字列の先頭の3文字は、バイトオーダーマスク(BOM)に対応しています。これは、ファイルをUTF8ファイルとして識別するためのバイトのシーケンスです。
Jsonを送信するファイルがtf8(no bom) encodingでエンコードされていることを確認してください。
(TextWranglerエディターで同じ問題が発生しました。save as-tf8(no bom)を使用して正しいエンコードを強制します)
それが役に立てば幸い。
私の場合、php
ファイルから問題が発生しました。不要な文字が与えられたため、json parsing
問題が発生しました。
次に、php code
にNotepad++
を貼り付け、Encoding
タブからEncode in utf-8 without BOM
を選択してこのコードを実行します-
私の問題はなくなりました。
if キーの値 iscoming asStringそれをJSONObject、に変換したい
まず、key.valueを次のようなString変数に入れます
String data = yourResponse.yourKey;
次にJSONArrayに変換します
JSONObject myObj=new JSONObject(data);