15095


JQueryのAjaxでdone()を使用しています。その返り値から以下のようにJsonデータを取得しようとしているのですが、エラーがでてできません。

[code]

    //$.Ajax().done(function(response){
      var data = $.parseJSON(response.responseJSON);
    });
    
[/code]

エラー

[code]

    Uncaught SyntaxError: Unexpected token o  //エラー箇所localhost/:1
    
[/code]

レスポンスのJSONは以下のものです。

[code]

    {"code":900,"message":"Already existed"}
    
[/code]

どうすればJSONを取り出してオブジェクトにできるのかおしえてください。よろしくお願いします。


CC BY-SA 3.0
2015-08-31T11:35:22.920
15081
2019-12-13T18:32:42.807
7232
question
javascript jquery
JQueryのAjaxのJSONを取得したい


`responseJSON`にはJSONの文字列ではなく、`$.parseJSON`で解析済みのオブジェクトが格納されます。つまり`responseJSON`をそのまま使えばよく、`$.parseJSON`は不要です。


CC BY-SA 3.0
2015-08-31T12:32:20.277
15084
2015-08-31T12:39:07.253
2015-08-31T12:39:07.253
3639
3639
15081
answer


`.done()`メソッドで使っている関数内の変数`response`には既に解析済みのJSONオブジェクトが入っています。これは`response.message`のように扱うことができます。

実行サンプル:

[code]

    var obj = {
      "code": 900,
      "message": "Already existed"
    };
    
    var jqxhr = $.ajax({
        type: 'POST',
        dataType: "json",
        url: "/echo/json/",
        dataType: "json",
        data: {
          json: JSON.stringify(obj)
        }
      })
      .done(function(response) {
        console.log("ajax done.");
        $("#code").text(response.code);
        $("#message").text(response.message);
      })
[/code]

[code]

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <table border="1">
      <tbody>
        <tr>
          <th>code</th>
          <td id="code"></td>
        </tr>
        <tr>
          <th>message</th>
          <td id="message"></td>
        </tr>
      </tbody>
    </table>
    
    <div id="error"></div>
[/code]

また余談ですが、質問コードに含まれる`responseJSON`はjqXHRオブジェクトのプロパティに存在します。これを利用すれば以下のような書き方もできます。

[code]

    $.ajax(...)
      .done(function(data, textStatus, jqXHR) {
        console.log(data === jqXHR.responseJSON); //-> true
      });
    
[/code]

参考リンク: <http://js.studio-kingdom.com/jquery/ajax/ajax#3>


CC BY-SA 4.0
2015-08-31T15:42:35.390
15095
2019-12-13T18:32:42.807
2019-12-13T18:32:42.807
32986
2391
15081
answer


すでに別の回答もあるのですが、サーバで正しくContent-
Typeを設定すればdone()にパースされたオブジェクトが渡ってくるので自分でパースする必要はありません。jQueryはパースに失敗するとfail()を呼ぶのでエラー処理していないと何が起きたかわかりません。  
サーバ側のプログラムを見直す必要があると思われます。  
JSONのContent-Typeは`Application/json`です


CC BY-SA 3.0
2015-08-31T23:15:38.497
15101
2015-08-31T23:15:38.497
8136
15081
answer


既に指摘されていて解決していそうなものですが何か引っかかる部分があるようで。  
とりあえず`response.responseJSON`には期待しているオブジェクト（JSONをパースしたもの）が格納されています。

> Uncaught SyntaxError: Unexpected token o //エラー箇所localhost/:1

このエラーは`response.responseJSON`を文字列化した結果`"[object
Object]"`を再度parseJOSN()した際のエラーと思われます。（`[]`を見つけて配列と解釈したが o が出現するのはおかしい）

* * *

> Chormeのツールでdata.responseJSONを表示するとObject {code: 900, message: "Already
> existed"}と表示されました。

とのことで正しくパースもなされているはずです。後はアクセスできないのは変数名が間違っているか、変数のスコープ外か、といったところでしょうか。


CC BY-SA 3.0
2015-08-31T23:31:30.223
15102
2015-08-31T23:31:30.223
4236
15081
answer