57

I am sending an ajax request with two post values, the first is "action" which defines what actions my php script has to parse, the other is "id" which is the id of the user it has to parse the script for.

The server returns 6 values inside an array() and is then encoded to JSON with the PHP function: json_encode();

Some of my responses are HTML, but when I encode it to JSON, it escapes "/" so it becomes "\/"
How do I disable that?

Also when I don't know how to display this in jQuery when I get the server response, I just thought that putting it all into a div would just display the numbers and HTML codes I had requested, but it displays the array as it is encoded in PHP.

PHP

$response = array();
$response[] = "<a href=''>link</a>";
$response[] = 1;
echo json_encode($response);

jQuery:

$.ajax({
    type: "POST",
    dataType: "json",
    url: "main.php",
    data: "action=loadall&id=" + id,
    complete: function(data) {
        $('#main').html(data.responseText);
    }
});

How do I make this into working JSON?

3
  • Can you also dump your JSON response to get a better idea of the problem? Not sure what you mean by "/" so it becomes "/" Commented Feb 1, 2012 at 15:41
  • have you tried api.jquery.com/jQuery.getJSON ? Commented Feb 1, 2012 at 15:42
  • sorry sid i made a backslash but it kinda disappeared :) but every normal slash gets a backslash before it "backslash"+"normal slash" ka_lin: i looked at it but i didnt understand it, and if i did, how would i send some post data with the request ? Commented Feb 1, 2012 at 15:44

5 Answers 5

85

You need to call the

$.parseJSON();

For example:

...
success: function(data){
       var json = $.parseJSON(data); // create an object with the key of the array
       alert(json.html); // where html is the key of array that you want, $response['html'] = "<a>something..</a>";
    },
    error: function(data){
       var json = $.parseJSON(data);
       alert(json.error);
    } ...

see this in http://api.jquery.com/jQuery.parseJSON/

if you still have the problem of slashes: search for security.magicquotes.disabling.php or: function.stripslashes.php

Note:

This answer here is for those who try to use $.ajax with the dataType property set to json and even that got the wrong response type. Defining the header('Content-type: application/json'); in the server may correct the problem, but if you are returning text/html or any other type, the $.ajax method should convert it to json. I make a test with older versions of jQuery and only after version 1.4.4 the $.ajax force to convert any content-type to the dataType passed. So if you have this problem, try to update your jQuery version.

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

6 Comments

it returns an error: missing ) after argument list "alert(data.0);"
yes, it was an example. You have to define your array with a key that can be converted to an object, because numbers can be. like $response['html'] = "something"; than you call it using the parseJSON json.html (like the example above).
pls make correction use alert(json.html); instead of alert(data.html);
when dataType: "json" is used in the ajax-call then you should not need to $.parseJSON; from the jQuery docs: "(dataType:)"json": Evaluates the response as JSON and returns a JavaScript object. "
Yes @northkildonan, you are right, in fact, the @sgb answer is the right answer, but if you look at the jquery code, when you pass dataType it really converts the response in the specific type, but Flaashing done that already, and it didn't converted. I don't know why this happens, but I have this same problem once, and the only way is parsing the response.
|
49

Firstly, it will help if you set the headers of your PHP to serve JSON:

header('Content-type: application/json');

Secondly, it will help to adjust your ajax call:

$.ajax({
    url: "main.php",
    type: "POST",
    dataType: "json",
    data: {"action": "loadall", "id": id},
    success: function(data){
        console.log(data);
    },
    error: function(error){
         console.log("Error:");
         console.log(error);
    }
});

If successful, the response you receieve should be picked up as true JSON and an object should be logged to console.

NOTE: If you want to pick up pure html, you might want to consider using another method to JSON, but I personally recommend using JSON and rendering it into html using templates (such as Handlebars js).

10 Comments

i tried your example, in my firebug console i get the response : missing } after property list "sucess: function(data){" yeah, you missed a coma after setting data. but now it gives me a response coded in json in firebug
I had a syntax error - "sucess" should be "success", and I missed a comma. You should be able to explore your response now and output parts of it into the DOM.
yes about that, how do u split the array into 6 bits in jquery and output them in 6 diffrent elements ?
it depends on the structure of your JSON, if you link a sample, I can help.
you'll need your PHP to output an array into JSON rather than html to do that.
|
2

Since you are creating a markup as a string you don't have convert it into json. Just send it as it is combining all the array elements using implode method. Try this.

PHP change

$response = array();
$response[] = "<a href=''>link</a>";
$response[] = 1;
echo implode("", $response);//<-----Combine array items into single string

JS (Change the dataType from json to html or just don't set it jQuery will figure it out)

$.ajax({
   type: "POST", 
   dataType: "html", 
   url: "main.php", 
   data: "action=loadall&id=" + id,
   success: function(response){
      $('#main').html(response);
   }
});

2 Comments

@Flaashing - Did you try this?
no because i want each of the 6 values to be displayed in 6 diffrent elements :)
2

Connect your javascript clientside controller and php serverside controller using sending and receiving opcodes with binded data. So your php code can send as response functional delta for js recepient/listener

see https://github.com/ArtNazarov/LazyJs

Sorry for my bad English

Comments

1

Try this code. You don't require the parse function because your data type is JSON so it is return JSON object.

$.ajax({
    url : base_url+"Login/submit",
    type: "POST",
    dataType: "json",
    data : {
        'username': username,
        'password': password
    },
    success: function(data)
    {
        alert(data.status);
    }
});

Comments

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.