1

このコードを実行すると、同じエラーが表示され続けます:無効な JSON プリミティブ: タイトル。

クライアント側:

        var title = new Array();

        ...

        for (var i = 0; i < names.length; ++i) {
            title[i] = '{ "titulo' + i + ':"' + names[i] + '"}';
        }

        $("#gif").show();

        $.ajax({
            async: true,
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            type: "POST",
            data: { titles: title },
            url: "../handlers/saveUpload.ashx",
            success: function (msg) {                    
                $("#gif").hide();
            }
        });

サーバ側:

        context.Response.ContentType = "application/json";
        var data = context.Request;
        var sr = new StreamReader(data.InputStream);
        var stream = sr.ReadToEnd();

        var javaScriptSerializer = new JavaScriptSerializer();

        var arrayOfStrings = javaScriptSerializer.Deserialize<string[]>(stream);

        foreach (var item in arrayOfStrings)
        {
            context.Response.Write(item);
        }

よろしく

4

2 に答える 2

4

この投稿で解決:配列を json に変換し、ashx ハンドラーで受け取る

string[] は、その操作の有効なジェネリック型ではありません。string にはパラメーターなしのコンストラクターがないため、シリアライザーが新しいコンストラクターを作成しようとすると失敗します。その上、すでに sr.ReadToEnd() からの文字列を持っているので、実際には逆シリアル化していません。文字列を解析して分割するように要求しているようなものですが、それはできません。

JavaScriptSerializer は非常に容赦がなく、正直なところ、このような配列をデシリアライズしようとすると、いつも髪を引き裂いてしまいます...サーバー側で DTO クラスを定義してマッピングを処理する方がはるかに優れています。

 [Serializable]
 public class Titles
 {
    public List<Title> TheTitles { get; set; } 
 }

 [Serializable]
 public class Title
 {
    public string title { get; set; }
 }

したがって、ハンドラーは次のようになります。

 public void ProcessRequest(HttpContext context)
        {
            try
            {
                context.Response.ContentType = "application/json";
                var data = context.Request;
                var sr = new StreamReader(data.InputStream);
                var stream = sr.ReadToEnd();    
                var javaScriptSerializer = new JavaScriptSerializer();
                var PostedData = javaScriptSerializer.Deserialize<Titles>(stream);    
                foreach (var item in PostedData.TheTitles )
                {
                   //this will write SteveJohnAndrew as expected in the response 
                   //(check the console!)
                   context.Response.Write(item.title);
                }
            }
            catch (Exception msg) { context.Response.Write(msg.Message); }
        }

そして、あなたのAJAXは次のようになります:

 function upload() 
        {
           //example data
            var Titles = [
                {'title':'Steve'}, {'title':'John'}, {'title':'Andrew'}
            ];    
            var myJSON = JSON.stringify({ TheTitles: Titles });    
            console.log(myJSON);    
            $.ajax({
                async: true,
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                type: "POST",
                data: myJSON,
                url: "jsonhandler.ashx",
                success: function (msg) {
                    console.log(msg);
                }     
            });
        }

DTO クラスの定義が JSON オブジェクト プロパティの定義と正確に一致することに注意してください。一致しない場合、逆シリアル化は機能しません。

それが役立つことを願っています。

于 2013-11-08T15:06:50.363 に答える
0

ディオゴの答えにもっと目立つコメントを追加するだけです。これは正しいですが、私の場合JsonProperty、親クラスの子のリストに追加する必要がありました」

[Serializable]
 public class Titles
 {
    [JsonProperty("Titles")] 
    public List<Title> TheTitles { get; set; } 
 }
于 2016-01-26T21:21:50.013 に答える