40

Web サービスから返された JSON に問題があります。JSON に引用符がないように見えますが、JSON に引用符を追加するとエラーが発生します。エラー メッセージは次のとおりです。「Uncaught SyntaxError: Unexpected token o. 文字列をコンソールに記録すると:[object Object],[object Object]

エラーをシミュレートするコード例を次に示します。

//Error I am trying to solve
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
var myData = JSON.parse(jsonString);

$(document).ready(function() {
    var $grouplist = $('#groups');
    $.each(myData, function() {
        $('<li>' + this.Name + '</li>').appendTo($grouplist);
    });
});

文字列を一重引用符で囲んだ同じコードを次に示します。できます

//Successful Javascript
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
var myData = JSON.parse(jsonString);

$(document).ready(function() {
    var $grouplist = $('#groups');
    $.each(myData, function() {
        $('<li>' + this.Name + '</li>').appendTo($grouplist);
    });
});

//Successful HTML
<ul id="groups"></ul>

しかし、実際のコードで必要なように、文字列に引用符を追加しようとすると失敗します。

//Does not work when I need to append quotes to the string:
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
jsonStringQuotes = "'" + jsonStringNoQuotes + "'";
var myData = JSON.parse(jsonStringQuotes);

$(document).ready(function() {
    var $grouplist = $('#groups');
    $.each(myData, function() {
        $('<li>' + this.Name + ',' +  this.Id + '</li>').appendTo($grouplist);
    });
});

エラーは次のとおりです: log string to console:[object Object],[object Object] data.js:809 Uncaught SyntaxError: Unexpected token '

私は困惑しています。どんな助けでも大歓迎です!ありがとうございました!

4

4 に答える 4

67

単一引用符で囲まないと、内部に 2 つのオブジェクトを含む配列が作成されます。これは JavaScript 独自の構文です。引用符を追加すると、そのオブジェクト (配列 + 2 オブジェクト) は文字列になります。JSON.parse文字列を JavaScript オブジェクトに変換するために使用できます。JSON.parseを使用して JavaScript オブジェクトを JavaScript オブジェクトに変換することはできません。

//String - you can use JSON.parse on it
var jsonStringNoQuotes = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';

//Already a javascript object - you cannot use JSON.parse on it
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];

さらに、JSON 文字列にリテラルの一重引用符を追加しているため、最後の例は失敗します。これは違法です。JSON 仕様では、二重引用符のみを使用できると規定されています。もしあなたがconsole.log以下にいたら...

console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'");
//Logs:
'[object Object],[object Object]'

配列の文字列表現が返され、コンマ区切りのリストに変換され、各リスト項目がオブジェクトの文字列表現であることがわかります[object Object]。JavaScript の連想配列は、各キー/値のペアがプロパティ/値である単なるオブジェクトであることを思い出してください。

なぜこれが起こるのですか?string"'"で開始しているため、配列を追加しようとしており、その配列の文字列表現を要求してから、別の string を追加しています"'"

JSON と Javascript はまったく別のものなので混同しないでください。JSON は人間が判読できるデータ形式であり、javascript オブジェクトを作成するときに使用される構文と一致するように意図されていました。JSON は文字列です。Javascript オブジェクトはそうではないため、コードで宣言されている場合は引用符で囲まれません。

このフィドルを参照してください: http://jsfiddle.net/NrnK5/

于 2013-10-08T04:55:56.120 に答える
2
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];

json オブジェクトを作成します。解析する必要はありません。

jsonStringQuotes = "'" + jsonStringNoQuotes + "'";

「[オブジェクト]」を返します

それが(以下)エラーを引き起こしている理由です

var myData = JSON.parse(jsonStringQuotes);
于 2013-10-08T04:44:00.783 に答える
1

サーバーから来るものは、すでに JSON オブジェクトとして評価されているのでしょうか? たとえば、jQuery の getメソッドを使用すると、次のようになります。

$.get('/service', function(data) {  
  var obj = data;

      /* 
         "obj" is evaluated at this point if server responded 
         with "application/json" or similar.
       */
      for (var i = 0; i < obj.length; i++) {
        console.log(obj[i].Name);
      }
    });

または、JSON オブジェクトを JSON 文字列リテラルに変換する必要がある場合は、次を使用できますJSON.stringify

var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
var jsonString = JSON.stringify(json);

jsonしかし、この場合、文字列化して解析する代わりに、変数を取得して参照することができない理由がわかりません。

于 2013-10-08T04:55:36.150 に答える
1

最後の例は無効な JSON です。文字列内を除き、JSON では一重引用符は使用できません。2 番目の例では、一重引用符は文字列にはありませんが、開始と終了を示す役割を果たします。

仕様については、http://www.json.org/を参照してください。

追加する必要があります: なぜあなたはこれを考えるのですか? それなら、解決策を考え出すお手伝いができるかもしれません。

于 2013-10-08T04:43:51.197 に答える