0

jQuery を使用して WCF Web サービスを使用しようとしています。返される Json データは次のとおりです。

{
    "ListOfPersons":
        "[
            {'Id':1,'FirstName':'Foo','LastName':'Bar'},
            {'Id':2,'FirstName':'Hello','LastName':'World'},
            {'Id':3,'FirstName':'Tanks','LastName':'Giving'},
        ]"
}

これらは私がJqueryで使用している関数です:

 var url = 'http://path/to/webservice.svc/ReturnTheList';
    $.getJSON(url, function (data) {
        success: readData(data)
    });

    function readData(data){
        alert(data.ListOfPersons[0].FirstName);
    }

問題は、アラートが何も返さないことです。

そして、Jsonを次のように変更すると:

{
    "ListOfPersons":
        [
            {"Id":1,"FirstName":"Foo","LastName":"Bar"},
            {"Id":2,"FirstName":"Hello","LastName":"World"},
            {"Id":3,"FirstName":"Tanks","LastName":"Giving"},
        ]
}

(単純な引用符を二重引用符に置き換え、[ の前と ] の後の二重引用符を削除しました)。

したがって、返される形式に問題があると結論付けました。問題は、この Web サービスを変更できないことです。「不適切な形式の」json 構造を使用するにはどうすればよいですか?

ありがとうございます、

よろしく

編集:

Web サービスの署名は次のとおりです。

 [OperationContract]
        [WebInvoke(Method = "GET",
             BodyStyle = WebMessageBodyStyle.WrappedResponse,
             ResponseFormat = WebMessageFormat.Json)]
        string ReturnTheList();
4

2 に答える 2

4

jQueryの新しいバージョン(1.4以降だと思います)は、無効なJSONをまったくロードしません。

2 つのオプションがあります。Web サービスを呼び出し、無効な JSON を解析して有効な形式で返すサーバー側プロキシを作成するか、この関数 (私ではなくAlex Sextonによって作成されました!)を使用できます。

jQuery.getInvalidJSON = function(url, data, callback) {
    return jQuery.get(url, data, function(d){
        callback.call(this, (new Function('return (' + d + ')'))());
    }, "text");
};

これは基本的に、Dewfy の回答と同じことを行いevalます。JSON 文字列に対して unsafe を実行して、使用可能なオブジェクトを取得します。このメソッドを使用する前に、ソースが信頼できることを確認してください。JSON に隠されている悪意のあるものはすべて実行されます。

編集:これを実際にテストする時間が少しありましたが、アレックスの機能に小さな間違いがあったことがわかりました。JSON 文字列 (変数 'd') をオブジェクトとして評価するには、括弧で囲む必要があります。これに応じて上記のコードを編集しました。

上記は厳密には有効ではない JSON をロードしますが (プロパティ名を引用符で囲んでいない、二重引用符ではなく単一引用符を使用しているなど)、制限があります。この Web サービスから使用している JSON は、単純に壊れています。

ほとんどの問題を引き起こしているのは、配列を二重引用符で囲んでいるようです。これは次のように回避できます。

jQuery.getInvalidJSON = function(url, data, callback) {
    return jQuery.get(url, data, function(d){
        var cleaned = d.replace(/"\[/g, '[').replace(/\]"/g, ']');
        callback.call(this, (new Function('return (' + cleaned + ')'))());
    }, "text");
};

そして、次のように呼び出します。

$.getInvalidJSON(url, null, readData);

これは非常にハックですが、適切で有効な JSON を返すように Web サービスを修正することを強くお勧めします。

于 2010-09-29T08:50:12.230 に答える
0

必要に応じて、evalを使用してペアの 2 番目の部分を jscript データ構造に変換します。

function readData(data){
    var subArr =  eval(data.ListOfPersons);
    alert(subArr[0].FirstName);
}
于 2010-09-29T08:44:44.950 に答える