2012-04-22 41 views
46

Tôi có một tệp JSON có 2 JSON-Mảng trong đó: Một mảng cho các tuyến đường và một Array cho các điểm tham quan.JSONException: Giá trị của kiểu java.lang.String không thể được chuyển thành JSONObject

Tuyến đường phải bao gồm một số điểm tham quan nơi người dùng được điều hướng đến. Đáng tiếc là tôi đang nhận được lỗi:

JSONException: Giá trị của loại java.lang.String không thể được chuyển đổi sang JSONObject

Dưới đây là các biến của tôi và các mã phân tích cú pháp JSON-File:

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); cho tôi thấy rằng lúc bắt đầu của chuỗi tạo ra có một dấu hiệu lạ: enter image description here

nhưng lỗi xảy ra ở đây:

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): Error parsing data org.json.JSONException: Value //STRANGE SIGN HERE // of type java.lang.String cannot be converted to JSONObject

ai có một đầu mối về cách để thoát khỏi những dấu hiệu để tạo JSONObject?

Trả lời

27

thấy điều này http://stleary.github.io/JSON-java/org/json/JSONObject.html#JSONObject-java.lang.String-

JSONObject

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

Xây dựng một JSONObject từ một nguồn chuỗi văn bản JSON. Đây là hàm tạo JSONObject được sử dụng phổ biến nhất.

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. 

bạn cố gắng sử dụng một số điều như:

new JSONObject("{your string}") 
+0

thx, tệp JSON của tôi bắt đầu bằng dấu ngoặc nhọn bên trái {và kết thúc bằng dấu ngoặc nhọn bên phải}. Tôi đã sử dụng trình xác thực JSON này để đảm bảo rằng Cú pháp JSON là chính xác. Vấn đề là, chuỗi mà tôi đang tạo ra khỏi JSON có một dấu lạ ở phía trước như yo có thể thấy ở đây: http://i.stack.imgur.com/uOiX8.png – RCK69

+0

Tôi có cùng vấn đề, trong một số trường hợp "thành công" tiền mặt ứng dụng của tôi vì cùng một lỗi của câu hỏi này. nhưng ở chế độ "thành công" khác, nó hoạt động chính xác. vấn đề là nếu chủ yếu là trường hợp nó hoạt động, vì vậy tôi bối rối. – Kenji

3

Tôi nghĩ rằng vấn đề có thể trong charset mà bạn đang cố gắng sử dụng. Nó có lẽ là tốt nhất để sử dụng UTF-8 thay vì iso-8859-1.

Cũng mở bất kỳ tệp nào đang được sử dụng cho InputStream của bạn và đảm bảo không chèn các ký tự đặc biệt. Đôi khi bạn phải thông báo cụ thể cho trình chỉnh sửa của mình để hiển thị các ký tự ẩn/đặc biệt.

15

Đã xảy ra sự cố tương tự trong vài ngày. Tìm thấy giải pháp cuối cùng. Máy chủ PHP trả lại một số ký tự không nhìn thấy mà bạn không thể nhìn thấy trong LOG hoặc trong System.out.

Vì vậy, giải pháp là tôi đã cố gắng để xâu chuỗi chuỗi json của tôi từng cái một và khi tôi đến chuỗi con (3) lỗi đã biến mất.

BTW. tôi đã sử dụng mã hóa UTF-8 trên cả hai mặt. PHP phụ: header('Content-type=application/json; charset=utf-8');

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

Vì vậy, thử một trong những giải pháp bởi một 1,2,3,4 ...! Hy vọng nó sẽ giúp các bạn!

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

Tôi yêu giải pháp của bạn :) Tôi đã gặp phải vấn đề tương tự, và tôi đã sửa nó bằng giải pháp của bạn. Không có vấn đề làm thế nào tôi thay đổi bộ ký tự của tài liệu, vẫn còn một số nhân vật vô hình trong đó. Cảm ơn giải pháp của bạn :) – code4j

+4

Tôi có cùng sự cố nhưng không thể thấy cách tạo chuỗi con sẽ làm cho việc này biến mất? – EHarpham

+0

Để quyết định giá trị sử dụng trong chuỗi con, chỉ cần chạy ứng dụng của bạn ở chế độ gỡ lỗi và sao chép giá trị sử dụng trong JSONObject. Dán nó vào Notepad ++ và bạn sẽ thấy ký tự không thành công JSON của bạn. Không cần phải thử nhiều lần. – saji159

33

Lý do là một số ký tự không mong muốn được thêm khi bạn soạn chuỗi. Giải pháp tạm thời là

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

Nhưng cố gắng xóa các ký tự ẩn trên chuỗi nguồn.

+0

làm việc tốt đẹp với tôi! cảm ơn tôi chỉ cần ném ngoại lệ. – Coderji

+0

Bí quyết tuyệt vời để loại bỏ vấn đề này;) Làm tốt lắm! – TheLittleNaruto

+0

Nó hoạt động như một sự quyến rũ !!! –

7

Đây là UTF-8 phiên bản, với một số ngoại lệ xử lý:

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; 

} 
+0

một số phương pháp không được chấp nhận –

+0

phụ thuộc vào API bạn đang sử dụng;) – izbrannick

1

3 ký tự vào đầu chuỗi json của bạn tương ứng với byte thứ tự Mask (BOM), mà là một chuỗi các byte để xác định tệp dưới dạng tệp UTF8.

Đảm bảo rằng tệp gửi json được mã hóa bằng mã hóa utf8 (không có bom).

(tôi đã có cùng một vấn đề, với biên tập viên TextWrangler Sử dụng save as -.. utf8 (không bom) để buộc các mã hóa phải)

Hy vọng nó giúp.

2

Tôi đã thực hiện thay đổi này và bây giờ nó hoạt động cho tôi.

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

Sau đó nhận được phản ứng chúng ta cần phải phân tích này bởi:

JSONObject myObj=new JSONObject(response); 

On phản ứng không có nhu cầu về dấu ngoặc kép.

1

Trong trường hợp của tôi vấn đề xảy ra từ php tập tin. Nó đã đưa ra các ký tự không mong muốn. Đó là lý do tại sao xảy ra sự cố json parsing.

Sau đó, tôi dán tôi php code trong Notepad++ và chọn Encode in utf-8 without BOM từ Encoding tab và chạy này số-

Vấn đề của tôi biến mất.

3

này làm việc cho tôi

json = json.replace("\\\"","'"); 
JSONObject jo = new JSONObject(json.substring(1,json.length()-1)); 
0

Trong trường hợp của tôi, ứng dụng Android của tôi sử dụng Volley để thực hiện cuộc gọi POST với một cơ thể trống rỗng đến một ứng dụng API lưu trữ trên Microsoft Azure.

Các lỗi là:

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

Đây là một đoạn trích về cách tôi đã được xây dựng theo yêu cầu Volley JSON:

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

tôi giải quyết vấn đề của tôi bằng cách tạo ra các JSONObject với một đối tượng JSON rỗng như như sau:

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

Giải pháp của tôi nằm dọc theo đường tới this older answer.

0

nếu giá trị của chínhtới khiChuỗivà bạn muốn chuyển nó sang JSONObject,

Trước tiên hãy key.value của bạn thành một biến String như

String data = yourResponse.yourKey; 

sau đó chuyển đổi thành JSONArray

JSONObject myObj=new JSONObject(data); 
Các vấn đề liên quan