I want to receive from an MySQL-Server all my data from a table.
So, I wrote a PHP script that fetches the complete table and encode it to JSON format.
PHP-Code:
<?php
include ("connect.php");
mysql_query("SET NAMES 'utf8'");
$query = mysql_query('SELECT * FROM MyTable);
while ($row = mysql_fetch_assoc($query))
{
$buffer[] = $row;
}
print json_encode( $buffer );
mysql_close($dbconnect);
?>
So, when I run the script, all the JSON String looks fine, no corupted characters etc.
In Android App:
When I run the following codes and receive the JSON String throught the HTTP, I get a strange String in the Debugger...
Screenshot: http://goo.gl/gTssQ
Java Code:
String result = "";
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
// HTTP Verbindung
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://mywebsite.com");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
catch(Exception e)
{
Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
}
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
result=sb.toString();
}
catch(Exception e)
{
Log.e("log_tag", "Error converting result "+e.toString());
}
try
{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++)
{
json_data = jArray.getJSONObject(i);
);
}
}
catch(JSONException e)
{
Log.e("log_tag", "Error parsing data "+e.toString());
}
I cant understand the Problem, because my Database is full UTF-8 and my script too.
I hope someone can help me! :-)
Greets, andr3w
Related
This is my code, in my log, i'm getting:
E/JSON Parser: Error parsing data org.json.JSONException Value xml of type java.lang.String cannot be converted to JSONObject
I really need a solution i have been searching for weeks now.
#Override
protected String doInBackground(String... para) {
List<NameValuePair> params=new ArrayList<NameValuePair>();
JSONObject json=jparser.makeHttpRequest(getDataUrl, "POST", params);
try {
success=json.getInt("success");
if(success==1){
drivers=new ArrayList<Driver>();
JSONArray sounds=json.getJSONArray("location");
for (int i = 0; i < sounds.length(); i++) {
JSONObject jobj=sounds.getJSONObject(i);
Driver d=new Driver();
d.setId(jobj.getString("id"));
d.setName(jobj.getString("name"));
d.setEmail(jobj.getString("email"));
d.setNumber(jobj.getString("number"));
d.setLatitude(jobj.getString("latitude"));
d.setLongitude(jobj.getString("longitude"));
d.setInfo(jobj.getString("info"));
d.setCost(jobj.getString("cost"));
drivers.add(d);
}
}
} catch (JSONException e) {
e.printStackTrace();
error=1;
}catch (Exception e) {
error=1;
}
return null;
}
And this is the JSONParser class
JSONParser.java
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// Making HTTP request
try {
// check for request method
if(method.equals("POST")){
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} else if(method.equals("GET")) {
// request method is GET
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
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();
json = sb.toString();
} 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;
}
}
PHP File
<?php
header('Content-Type: application/json');
$response = array();
// include db connect class
require_once 'core/db_connect.php';
$db = new DB_CONNECT();
$sql="SELECT * FROM locations WHERE online=1";
$result = mysqli_query($db->connect(), $sql) or die(mysqli_error($db->connect()));
if (mysqli_num_rows($result)>0) {
$response["location"] = array();
while ($row=mysqli_fetch_array($result)) {
$files=array();
$files["id"]=$row["id"];
$files["name"]=$row["name"];
$files["email"]=$row["email"];
$files["number"]=$row["number"];
$files["latitude"]=$row["latitude"];
$files["longitude"]=$row["longitude"];
$files["info"]=$row["vehicleinfo"];
$files["cost"]=$row["costpkm"];
array_push($response["location"], $files);
}
$response["success"]=1;
echo json_encode($response);
} else {
$response["success"]=0;
$response["message"]="No Taxi found";
echo json_encode($response);
}
?>
Based on your error, the return result for makeHttpRequest is an xml object instead of json formated string.
Solved
the error was due to incorrect url, the xampp apache server was returning an object not found page..error 404, which is an xml file. That's why the return result for makeHttpRequest is an xml object instead of json formated string.
I use the following function in java to connect to my php script in a server.
The script queries for an image (BLOB), encodes it (base64) and sends it back in JSON format.
The problem is that I can get some of the encoded data but not all of them. Should I use any headers on my httpRequest? What am I doing wrong?
Here is my java function:
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// Making HTTP request
try {
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
System.out.println("Print1: "+json);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
return null;
}
// 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 null;
}
System.out.println("Print2: "+jObj.toString());
// return JSON String
return jObj;
}
Here is my PHP code showing the JSON structure:
$response = array(
"success" => 0,
"message" => "",
"data" => "");
$stmt->bindColumn(1, $binary, PDO::PARAM_LOB);
$stmt->bindColumn(2, $professorName);
$stmt->fetch(PDO::FETCH_BOUND);
$pic = base64_encode($binary);
$data = array(
"photo" => $pic,
"professorName" => $professorName
);
$response["success"] = 1;
$response["message"] = "We have results!";
$response["data"] = $data;
echo json_encode($response);
After testing I realized that if I use a small image (tested size < 1Kb) everything works as it should.
If I try to obtain a larger image (here 5 Kb) the data I obtain is cut in the middle.
The json structure doesn't arrive complete.
Here is an example of a successful transfer:
Print1: {"success":1,"message":"We have results!","data":
{"photo":"iVBORw0KGgoAAAANS~~~~more data~~~~N6GGYzAAAAAElFTkSuQmCC","professorName":"cluvas"}}
Print2: {"data":{"kathigitisName":"cluvas","photo":"iVBORw0K~~~~more data~~~~AElFTkSuQmCC"},
"message":"We have results!","success":1}
Here an example of an unsucessful one
Print1: {"success":1,"message":"We have results!","data":
{"photo":"\/9j\/4AAQS~~~~more data~~~~6KKogkH\/ //unexpected end of data
Print2: {"data":{"professorName":"cluvas",
"photo":"\/9j\/4AAQS~~~~more data~~~~K+U\/Ce //unexpected end of data
public class HttpPosrHitter {
public static String getJSONfromURL(String url, String member_id,
String phonenumber) {
InputStream is = null;
String result = "";
JSONObject jArray = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("memberid", member_id));
pairs.add(new BasicNameValuePair("numbers", phonenumber));
httppost.setEntity(new UrlEncodedFormEntity(pairs));
// http post
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
// convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
try {
jArray = new JSONObject(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
return result;
}
}
This is class from which i am Post Phone Number to web service and getting response .
when i Post Number of Phone which has 15 to 20 contact i am getting response . but when i post number which has 150 contact i am not getting response one at a time i have to relaunch app two time then i am getting response . i dont know where i am doing mistake . even i am unable to read phone large file in chunks with fixed size buffer.
Just to solve all your potential bugs in one single shot: is there anything preventing you from using Retrofit and GSON or Jackson?
Each time I see such JSON/InputStream/URLConnection/... questions, I keep wondering why people keep on spending time to reinvent basic stuff instead of actually writing apps.
public class HttpPosrHitter {
public static String getJSONfromURL(String url, String member_id,
String phonenumber) {
InputStream is = null;
String result = "";
JSONObject jArray = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("memberid", member_id));
pairs.add(new BasicNameValuePair("numbers", phonenumber));
httppost.setEntity(new UrlEncodedFormEntity(pairs));
// http post
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity); //changes Made
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
try {
jArray = new JSONObject(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
return result;
}
}
I have an application that post data to a php file in an online server. When the post is done i get a garbage of html code. In it says I have a php error and that is Invalid argument supplied for each() on line 33. However this problem does not occur if I run it in localhost. I don't understand why this problem is occuring. So someone please help me to solve it.
The following is my jsonparser Class
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getandpostJSONFromUrl(String url, String method,JSONArray name) {
// Making HTTP request
try {
// defaultHttpClient
if (method == "POST") {
HttpParams params = new BasicHttpParams();
//params.setParameter("data", auth);
HttpClient httpclient = new DefaultHttpClient(params);
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("json", name.toString()));
for (NameValuePair nvp : postParams) {
String name2 = nvp.getName();
String value = nvp.getValue();
Log.d("NameValue pair content", ""+name2+""+value);
}
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParams,HTTP.UTF_8);
httpPost.setEntity(entity);
HttpResponse response = httpclient.execute(httpPost);
String responseBody = EntityUtils.toString(response.getEntity());
Log.d("",responseBody);
}
if (method == "GET") {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (method == "POST") {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
} catch (Exception e) {
Log.e("Buffer error", "Buffer error" + e);
}
} else if (method == "GET") {
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();
json = sb.toString();
} 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;
}
}
The following is the php file on the server
<?php
header('Content-type: application/json');
/*define('DB_NAME', 'a1422982_sshop');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');*/
define('DB_NAME', 'onlineshop');
define('DB_USER', 'shop');
define('DB_PASSWORD', 'pass');
define('DB_HOST', 'mysql28.000webhost.com');
$link = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
if(!$link){
die('could not connect: '.msql_error());
}
$db_selected=mysql_select_db(DB_NAME, $link);
if(!$db_selected){
die('Can not use '.DB_NAME.':'.mysql_error());
}
//var_dump(json_decode ($_POST['json'])));
if($_POST['json']){
$parsed = json_decode($_POST['json'],TRUE);
$i=0;
foreach ($parsed as $obj) {
$ProductName = $obj['Name'];
$ProductQuantity= $obj['Quantity'];
$sql="Update productlist Set Quantity='$ProductQuantity' where Name='$ProductName';";
$retval = mysql_query( $sql, $link );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
$i++;
echo $ProductName." ".$ProductQuantity;
}
}else{
echo "empty";
}
?>
there's a missing options on your HttpPost request set the entity metadata and the resulting entity as string.
In your java code you can do this:
Map<String, String> postData = new HashMap<String, String>();
postData.put("KEY", "yourvalue");
JSONObject holder = new JSONObject(postData);
StringEntity jsonStringEntity = new StringEntity(holder.toString());
httpost.setEntity(jsonStringEntity);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
in that way your PHP code could actually parse your post data since json_decode() expecting json as parameter.
Following json will be received but through the http://localhost/getData.php but exception is thrown
{"username":"not found","password":null}
Log I received
02-19 17:31:54.745: E/JSON Parser(5277): Error parsing data org.json.JSONException: End of input at character 0 of
02-19 17:31:59.185: E/JSON Parse(5277): ERROR
Following code is the method where exception throw
#Override
protected String doInBackground(String... url){
try{
String resultText = "";
EditText edit = (EditText)findViewById(R.id.text_box);
id = edit.getText().toString();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id",id));
JSONObject json = jsonParser.HttpRequest("http://localhost/getData.php", params);
resultText = json.getString("username");
}catch(Exception e){
e.printStackTrace();
Log.e("JSON Parse","ERROR");
}
return "";
}
public class SimpleJsonParser {
public SimpleJsonParser(){
}
public JSONObject HttpRequest(String url, List<NameValuePair> params){
InputStream input = null;
JSONObject jObj = null;
String json = "";
String line;
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
paramsString = URLEncodedUtils.format(params,"utf-8");
url += "?" + paramsString;
HttpGet httpGet = new HttpGet(url);
try{
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
HttpEntity entity = response.getEntity();
input = entity.getContent();
BufferedReader reader =
new BufferedReader(new InputStreamReader(input));
while((line = reader.readLine())!=null){
builder.append(line);
}
json = builder.toString();
} else {
Log.e("JSON Parser","Failed to download file");
}
}catch(ClientProtocolException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
try {
jObj = new JSONObject(json);
input.close();
} catch (Exception e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jObj;
}
}
Anything wrong with my code? The code I provided is where exception throws occur
From what you mentioned, it appears that you are doing this via an emulator.
Emulator may not be able to access http://localhost//. You can try access using, loopback address or the ip address.
You never verify that you actually have received anything after reading from the stream returned from the HttpEntity. That exception is telling you there's no input at character 0 (The first character) - you have nothing to parse; it's an empty string. Nothing was ever appended to your StringBuilder.
public static void main(String[] args) throws JSONException
{
String json = "{\"username\":\"not found\",\"password\":null}";
JSONObject jObj = new JSONObject(json);
}
Throws no such exception. Often writing a small test case will point you in the right direction.
As others have mentioned, this is probably because you are using the wrong URL or maybe your parameters? Since you're getting back a 200 OK you're obviously connecting to a webserver and getting a response ... I'd check to see if that PHP is working as you expect.
Inside simpleJarsonParser class, I replace the following code
HttpClient httpClient = new DefaultHttpClient();
to
DefaultHttpClient httpClient = new DefaultHttpClient();
and it works. And of course I have replace localhost to 10.0.2.2 as I'm using xampp and android emulator.