java.lang.String 类型的值在 android 上无法转换为 JSONObject
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23111640/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Value <br of type java.lang.String cannot be converted to JSONObject on android
提问by Aakash
This is my java code and i am getting problem in this: W/System.err(1362): org.json.JSONException: Value
这是我的 java 代码,我在这方面遇到问题:W/System.err(1362): org.json.JSONException: Value
public class Main extends Activity {
// label to display gcm messages
TextView lblMessage;
Controller aController;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/******************* Intialize Database *************/
DBAdapter.init(this);
// Get Global Controller Class object
// (see application tag in AndroidManifest.xml)
aController = (Controller) getApplicationContext();
// Check if Internet present
if (!aController.isConnectingToInternet()) {
// Internet Connection is not present
aController.showAlertDialog(Main.this,
"Internet Connection Error",
"Please connect to Internet connection", false);
// stop executing code by return
return;
}
//Check device contains self information in sqlite database or not.
int vDevice = DBAdapter.validateDevice();
if(vDevice > 0)
{
// Launch Main Activity
Intent i = new Intent(getApplicationContext(), GridViewExample.class);
startActivity(i);
finish();
}
else
{
String deviceIMEI = "";
if(Config.SECOND_SIMULATOR){
//Make it true in CONFIG if you want to open second simutor
// for testing actually we are using IMEI number to save a unique device
deviceIMEI = "000000000000000";
}
else
{
// GET IMEI NUMBER
TelephonyManager tManager = (TelephonyManager) getBaseContext()
.getSystemService(Context.TELEPHONY_SERVICE);
deviceIMEI = tManager.getDeviceId();
}
/******* Validate device from server ******/
// WebServer Request URL
String serverURL = Config.YOUR_SERVER_URL+"validate_device.php";
// Use AsyncTask execute Method To Prevent ANR Problem
LongOperation serverRequest = new LongOperation();
serverRequest.execute(serverURL,deviceIMEI,"","");
}
}
// Class with extends AsyncTask class
public class LongOperation extends AsyncTask<String, Void, String> {
// Required initialization
//private final HttpClient Client = new DefaultHttpClient();
// private Controller aController = null;
private String Error = null;
private ProgressDialog Dialog = new ProgressDialog(Main.this);
String data ="";
int sizeData = 0;
protected void onPreExecute() {
// NOTE: You can call UI Element here.
//Start Progress Dialog (Message)
Dialog.setMessage("Validating Device..");
Dialog.show();
}
// Call after onPreExecute method
protected String doInBackground(String... params) {
/************ Make Post Call To Web Server ***********/
BufferedReader reader=null;
String Content = "";
// Send data
try{
// Defined URL where to send data
URL url = new URL(params[0]);
// Set Request parameter
if(!params[1].equals(""))
data +="&" + URLEncoder.encode("data1", "UTF-8") + "="+params[1].toString();
if(!params[2].equals(""))
data +="&" + URLEncoder.encode("data2", "UTF-8") + "="+params[2].toString();
if(!params[3].equals(""))
data +="&" + URLEncoder.encode("data3", "UTF-8") + "="+params[3].toString();
Log.i("GCM",data);
// Send POST data request
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
// Append server response in string
sb.append(line + "\n");
}
// Append Server Response To Content String
Content = sb.toString();
}
catch(Exception ex)
{
Error = ex.getMessage();
}
finally
{
try
{
reader.close();
}
catch(Exception ex) {}
}
/*****************************************************/
return Content;
}
protected void onPostExecute(String Content) {
// NOTE: You can call UI Element here.
// Close progress dialog
Dialog.dismiss();
if (Error != null) {
} else {
// Show Response Json On Screen (activity)
/****************** Start Parse Response JSON Data *************/
aController.clearUserData();
JSONObject jsonResponse;
try {
/****** Creates a new JSONObject with name/value mappings from the JSON string. ********/
jsonResponse = new JSONObject(Content);
/***** Returns the value mapped by name if it exists and is a JSONArray. ***/
/******* Returns null otherwise. *******/
JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");
/*********** Process each JSON Node ************/
int lengthJsonArr = jsonMainNode.length();
for(int i=0; i < lengthJsonArr; i++)
{
/****** Get Object for each JSON node.***********/
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
/******* Fetch node values **********/
String Status = jsonChildNode.optString("status").toString();
Log.i("GCM","---"+Status);
// IF server response status is update
if(Status.equals("update")){
String RegID = jsonChildNode.optString("regid").toString();
String Name = jsonChildNode.optString("name").toString();
String Email = jsonChildNode.optString("email").toString();
String IMEI = jsonChildNode.optString("imei").toString();
// add device self data in sqlite database
DBAdapter.addDeviceData(Name, Email,RegID, IMEI);
// Launch GridViewExample Activity
Intent i1 = new Intent(getApplicationContext(), GridViewExample.class);
startActivity(i1);
finish();
Log.i("GCM","---"+Name);
}
else if(Status.equals("install")){
// Launch RegisterActivity Activity
Intent i1 = new Intent(getApplicationContext(), RegisterActivity.class);
startActivity(i1);
finish();
}
}
/****************** End Parse Response JSON Data *************/
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
PHP code:i have used a array in this.suggest me why type mismatch occuring
PHP 代码:我在这个中使用了一个数组。建议我为什么会发生类型不匹配
<?php
require_once('loader.php');
$imei = $_REQUEST['data1'];
$regID = $_REQUEST['data2'];
//$resultUsers = getRegIDUser($regID);
$resultUsers = getIMEIUser($imei);
if ($resultUsers != false)
$NumOfUsers = mysql_num_rows($resultUsers);
else
$NumOfUsers = 0;
$jsonData = array();
if ($NumOfUsers > 0) {
while ($rowUsers = mysql_fetch_array($resultUsers)) {
$jsonTempData = array();
$jsonTempData['regid'] = $rowUsers["gcm_regid"];
$jsonTempData['name'] = $rowUsers["name"];
$jsonTempData['email'] = $rowUsers["email"];
$jsonTempData['imei'] = $rowUsers["imei"];
$jsonTempData['status'] = "update";
$jsonData[] = $jsonTempData;
}
}
else{
$jsonTempData = array();
$jsonTempData['regid'] = "";
$jsonTempData['name'] = "";
$jsonTempData['email'] = "";
$jsonTempData['imei'] = "";
$jsonTempData['status'] = "install";
$jsonData[] = $jsonTempData;
}
$outputArr = array();
$outputArr['Android'] = $jsonData;
// Encode Array To JSON Data
print_r( json_encode($outputArr));
?>
getting problems....!!
遇到问题....!!
Here are the details regarding exception..
以下是有关异常的详细信息..
04-16 12:54:57.876: W/System.err(1603): org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
04-16 12:54:57.916: W/System.err(1603): at org.json.JSON.typeMismatch(JSON.java:111)
04-16 12:54:57.916: W/System.err(1603): at org.json.JSONObject.<init>(JSONObject.java:158)
04-16 12:54:57.916: W/System.err(1603): at org.json.JSONObject.<init>(JSONObject.java:171)
04-16 12:54:57.916: W/System.err(1603): at com.androidexample.mobilegcm.Main$LongOperation.onPostExecute(Main.java:213)
04-16 12:54:57.926: W/System.err(1603): at com.androidexample.mobilegcm.Main$LongOperation.onPostExecute(Main.java:1)
04-16 12:54:57.926: W/System.err(1603): at android.os.AsyncTask.finish(AsyncTask.java:631)
04-16 12:54:57.946: W/System.err(1603): at android.os.AsyncTask.access0(AsyncTask.java:177)
04-16 12:54:57.976: W/System.err(1603): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
04-16 12:54:57.976: W/System.err(1603): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 12:54:57.976: W/System.err(1603): at android.os.Looper.loop(Looper.java:137)
04-16 12:54:58.007: W/System.err(1603): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-16 12:54:58.007: W/System.err(1603): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 12:54:58.016: W/System.err(1603): at java.lang.reflect.Method.invoke(Method.java:511)
04-16 12:54:58.026: W/System.err(1603): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-16 12:54:58.036: W/System.err(1603): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-16 12:54:58.036: W/System.err(1603): at dalvik.system.NativeStart.main(Native Method)
This is the all content is returning.....in log...
这是所有内容正在返回.....在登录...
04-16 15:50:10.575: I/returning(1579): <br />
04-16 15:50:10.575: I/returning(1579): <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
04-16 15:50:10.575: I/returning(1579): <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined index: data2 in C:\wamp\www\gcm_server_files\validate_device.php on line <i>6</i></th></tr>
04-16 15:50:10.575: I/returning(1579): <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
04-16 15:50:10.575: I/returning(1579): <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
04-16 15:50:10.575: I/returning(1579): <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0193</td><td bgcolor='#eeeeec' align='right'>145240</td><td bgcolor='#eeeeec'>{main}( )</td><td title='C:\wamp\www\gcm_server_files\validate_device.php' bgcolor='#eeeeec'>..\validate_device.php<b>:</b>0</td></tr>
04-16 15:50:10.575: I/returning(1579): </table></font>
04-16 15:50:10.575: I/returning(1579): {"Android":[{"regid":"","name":"","email":"","imei":"","status":"install"}]}
still returning this much part of html code..i need only code part from {"Android"} onwards...i.e the last line only..
仍然返回 html 代码的大部分......我只需要从 {"Android"} 开始的代码部分......即只需要最后一行......
04-16 16:17:49.925: W/System.err(4958): org.json.JSONException: Expected ':' after main at character 6 of {main}( )</td><td title='C:\wamp\www\gcm_server_files\validate_device.php' bgcolor='#eeeeec'>..\validate_device.php<b>:</b>0</td></tr>
04-16 16:17:49.925: W/System.err(4958): </table></font>
04-16 16:17:49.925: W/System.err(4958): {"Android":[{"regid":"","name":"","email":"","imei":"","status":"install"}]}
回答by Joffrey
About your HTML
关于你的 HTML
You're trying to get rid of some HTML code that actually tells you there is an error. Here is what it looks like:
您正在尝试删除一些实际上告诉您存在错误的 HTML 代码。这是它的样子:
Maybe if you solve that problem, your JSON issue will vanish on its own, because you won't have HTML stuff before your JSON.
也许如果你解决了这个问题,你的 JSON 问题就会自行消失,因为在你的 JSON 之前你不会有 HTML 内容。
Earlier part of the response
响应的早期部分
I guess you are getting your exception at this line (please tell me if I'm wrong):
我猜您在这一行遇到了异常(如果我错了,请告诉我):
jsonResponse = new JSONObject(Content);
If you want to know what's wrong with the parsing of Content
, you might want to log that string and see how it looks.
如果您想知道 的解析出了什么问题Content
,您可能想记录该字符串并查看它的外观。
Apparently, Content
is HTML code (It contains some <br
, according to the exception) instead of a proper JSON String. Take a look at where you get this string from, this is probably your problem.
显然,Content
是 HTML 代码(<br
根据例外情况,它包含一些)而不是正确的 JSON 字符串。看看你从哪里得到这个字符串,这可能是你的问题。
UPDATE:
更新:
OK, according to what you posted, your Content
string contains the JSON string (the one surrounded by braces {}
) but it also contains an HTML part, which needs to be removed.
好的,根据您发布的内容,您的Content
字符串包含 JSON 字符串(用大括号括起来的字符串{}
),但它还包含需要删除的 HTML 部分。
Put this code before you try to create the JSONObject
:
在尝试创建之前放置此代码JSONObject
:
int jsonStart = Content.indexOf("{");
int jsonEnd = Content.lastIndexOf("}");
if (jsonStart >= 0 && jsonEnd >= 0 && jsonEnd > jsonStart) {
Content = Content.substring(jsonStart, jsonEnd + 1);
} else {
// deal with the absence of JSON content here
}
UPDATE 2:
更新 2:
The previous code snippet does not seem sufficient because your HTML contains braces ({}
). If the server always returns that kind of HTML, you might want to just get rid of the font
tag before running the previous snippet:
前面的代码片段似乎不够充分,因为您的 HTML 包含大括号 ( {}
)。如果服务器总是返回那种 HTML,你可能只想在运行之前的代码片段之前去掉font
标签:
Content = Content.replaceFirst("<font>.*?</font>", "");
WARNING: This is very sketchy, and answers only this very particular issue. It won't work with every possible server response.
警告:这是非常粗略的,并且只回答了这个非常特殊的问题。它不适用于所有可能的服务器响应。
You should have a look at other questions regarding the removal of HTML from a String in Java, for more complete answers.
您应该查看有关从 Java 中的字符串中删除 HTML 的其他问题,以获得更完整的答案。
回答by shaligram prakash
You have to edit the php configuration file.
您必须编辑php配置文件。
Find the line:
找到这一行:
error_reporting = E_ALL
and replace with:
并替换为:
error_reporting = E_ALL ^ E_DEPRECATED
If you don't have access to the configuration file you can add this line to the php wordpress file (maybe headers.php
):
如果您无权访问配置文件,则可以将此行添加到 php wordpress 文件(也许headers.php
):
error_reporting(E_ALL ^ E_DEPRECATED);