0

I am passing back a JSON object (consisting of an array of strings) from php. I am trying to convert the object into a Java jArray but the string I get back from my php file isn't formed correctly:

String from php (I have 2 entries in my db tips table)

[{"0":"2","id":"2","1":"2","household_id":"2","2":"3","stepgreen_id":"3","3":"tip 1","tip":"tip 1","4":"2011-08-05","dateOfTip":"2011-08-05","5":"3","likes":"3"}]

[{"0":"2","id":"2","1":"2","household_id":"2","2":"3","stepgreen_id":"3","3":"tip 1","tip":"tip 1","4":"2011-08-05","dateOfTip":"2011-08-05","5":"3","likes":"3"},{"0":"91","id":"91","1":"1","household_id":"1","2":"1","stepgreen_id":"1","3":"tip 2","tip":"tip 2","4":"2011-08-04","dateOfTip":"2011-08-04","5":"1","likes":"1"}]

Here is my php code

    <?php
    // mysql connection, etc....
    $query  = "SELECT * FROM Tips";
    $result = mysql_query($query);
    while($row = mysql_fetch_array($result))
    {
    $output[]=$row;
    print(json_encode($output));
    } 
    mysql_close($con);
    ?>

In Java, I do the following. What happens is that I get back a jArray with only one entry. I expect 2. I'm not sure why the php json object is returning an array of 1 string and a second array of 2 strings. I only expect to receive an array of 2 strings.

     try {
      InputStream responseData;
      responseData = httpEntity.getContent();
      js = convertStreamToString(responseData);
      Log.v(LOG_TAG, js);
      jArray = new JSONArray(js);

      JSONObject json_data = null;

      Log.v(LOG_TAG, "Arraysize: " + jArray.length());
         for (int i = 0; i < jArray.length(); i++) {
        Log.v(LOG_TAG, "entering loop");
        json_data = jArray.getJSONObject(i);
        tip = json_data.getString("tip");
        stepgreenId = json_data.getString("stepgreen_id");
      dateOfTip = json_data.getString("dateOfTip");
      householdId = json_data.getString("household_id");
      likes = json_data.getString("likes");
      Log.v(LOG_TAG, "Json tip= " + tip + " stepgreen id: " + stepgreenId +  " household_id: " + householdId + " likes: " + likes);

    }
} catch (IllegalStateException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
1
  • What is js when you run it? Commented Aug 5, 2011 at 17:04

4 Answers 4

1

If you do the following:

$first_array = array('first array');
$second_array = array('second array');

echo json_encode($first_array);
echo json_encode($second_array);

The JSON that you will get is invalid if you want to deserialize it. You have to create a common array for them and then print it out. In your case:

<?php
// mysql connection, etc....
$query  = "SELECT * FROM Tips";
$result = mysql_query($query);
$output = array();
while($row = mysql_fetch_array($result))
    $output[]=$row;

print(json_encode($output));
mysql_close($con);

This should work.

Sign up to request clarification or add additional context in comments.

Comments

0

Don't know much java, but on the PHP side you should try using mysql_fetch_assoc or mysql_fetch_object instead. mysql_fetch_array fetches numeric and string keys which are duplicate, and the numeric ones may be causing the problem in java.

Comments

0

the proper way to do this is to return a json string with both (or more) objects in it.

$first_array = array(...);
$second_array = array(...);

die(json_encode(array(
    $first_array,
    $second_array
)));

I would also suggest using jQuery's getJSON() function. it simply returns a JS object you can easily read/manipulate. api.jquery.com/jQuery.getJSON

$.getJSON('yourFeedPage.php', 'id=xyz123', function(obj) {
    for (int i = 0; i < obj.length(); i++) {
        var item = obj[i];

        tip = item.tip;
        stepgreenId = item.stepgreen_id;
        dateOfTip = item.dateOfTip;
        householdId = item.household_id;
        likes = item.likes;
    }
);

Comments

0

You've got your print_r() inside your while() loop, so you're dumping out a json string for every row in the query result set, and this string keeps growing as you add more records. This means if you get 5 rows, you'll have 5 json strings dumped out.

Most likely Java is taking only the FIRST of those json strings (the first/single record one) and dumping the rest on the floor.

Change your code to this and things should start working:

while($row = mysql_fetch_array($result)) {
    $output[] = $row;
}
print(json_encode($output));

1 Comment

Yes, this helped and also the statement: $output = array(); before the while loop. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.