1

ExtJs 4.0 を使用しています。

Web サービスからデータベースからデータをフェッチし、グリッド パネルに設定しようとしていますが、次のエラーExt.Error: サーバーから返された JSON を解析できません: 無効な JSON 文字列をデコードしようとしています:

extjs コード:

Ext.application({
    name: 'HelloExt',
    launch: function() {
        // Model definition and remote store (used Ext examples data)
        Ext.define('ForumThread', {
            extend: 'Ext.data.Model',
            fields: ['countryId', 'countryName'],
            idProperty: 'countryId'
        });

        var store = Ext.create('Ext.data.Store', {
            pageSize: 20,
            model: 'ForumThread',
            autoLoad: true,
            proxy: {
                type: 'ajax',
                url: '../reports/report.asmx/display',
                contentType: "application/json; charset=utf-8;",
                 //url: '/grid.json',
                reader: {    
                    root: 'Data',          
                    type: 'json'
                }
            }
        });

        // Define grid that will automatically restore its selection after store reload
        Ext.define('PersistantSelectionGridPanel', {
            extend: 'Ext.grid.Panel'

        });

        // Create instance of previously defined persistant selection grid panel
        var grid = Ext.create('PersistantSelectionGridPanel', {
            autoscroll: true,
            height: 300,
            renderTo: Ext.getBody(),
            //region: 'center',
            store: store,
            multiSelect: true, // Delete this if you only need single row selection
            stateful: true,
            forceFit: true,
            loadMask: false,
            viewConfig: {
                stripeRows: true
            },
            columns:[{
                id: 'countryId',
                text: "countryId",
                dataIndex: 'countryId',
                flex: 1,
                sortable: false
            },{
                text: "countryName",
                dataIndex: 'countryName',
                width: 70,
                align: 'right',
                sortable: true
            } ]
        });
    }
});

レポート.asmx

 [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [ToolboxItem(false)]
        // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
      [System.Web.Script.Services.ScriptService]
 [Serializable]

        public class report : System.Web.Services.WebService
            {

                [WebMethod]
                public string HelloWorld()
                {
                    return "Hello World";
                }
                [WebMethod]
                [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)]
                public string display()
                {
                     employee obj = new employee();

                JavaScriptSerializer serializer = new JavaScriptSerializer();
                return serializer.Serialize(obj.selectAll_employeeDetail(0, 0, 0));
                }
            }

誰かが私に提案できますか...私のコードで何が間違っていますか?/

4

1 に答える 1

2

おそらく正しくない奇妙なカスタム JSON シリアライゼーションを作成したためかもしれません (末尾の末尾の文字を削除するのはなぜですか?)

.NET JSON シリアル化は次のように単純です。

JavaScriptSerializer serializer = new JavaScriptSerializer();
HttpContext.Response.Write(serializer.Serialize(Object));
HttpContext.Response.ContentType = "application/json";

[Serializable] 属性をクラスに追加するか、既にその属性を持つ .NET タイプを使用する必要があります。

返される文字列は有効な JSON ではない必要があります。

[編集] 興味深いこと: Asmx サービス (Microsoft AJAX スクリプトから設計されたソリューションをリバースしたため、おそらく WCF サービスも) は、http の RFC を引き起こす必要があるため、応答のタイプを定義するための 'Accept' ヘッダーを探しません: http://www .w3.org/プロトコル/rfc2616/rfc2616-sec14.html

Accept 要求ヘッダー フィールドを使用して、応答に受け入れられる特定のメディア タイプを指定できます。

したがって、これで十分なはずですが、jQuery.ajax では十分ではありません。上記の AJAX スクリプトから、ヘッダーの Content-Type を取得しました。

"Content-Type": "application/json; charset=utf-8"

このjQueryでうまくいきました。したがって、このヘッダーをリクエストに追加する必要があると思いますが、これは機能するはずです。[ScriptMethod] 属性が JSON のデフォルト応答を状態http://msdn.microsoft.com/en-us/library/system.web.script.services.scriptmethodattribute.aspxとして設定していないのは奇妙なことです。

応答を JSON または XML としてシリアル化するかどうかを指定します。デフォルトは Json です。また、このヘッダーを使用して、サービスをスクリプト サービスとして機能させる必要があります。

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields :

Content-Type リクエスト本文の MIME タイプ (POST および PUT リクエストで使用)

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html :

Content-Type エンティティ ヘッダー フィールドは、受信者に送信されるエンティティ ボディのメディア タイプを示します。

したがって、マイクロソフトの人々は、「JSON として送信しない場合は、これも送信しません」という方法で物事を行うと思います。:)

これがうまくいくことを願っています。

PS: .NET 組み込み型または [Serializable] 属性を持つ型を返す場合、これは json サービスであるため、それを返すことができます。とにかくシリアル化される応答を事前にシリアル化する必要はありません。

于 2012-11-06T07:18:41.790 に答える