преобразовать массив в json и получить в обработчике ashx

Я пробовал много возможных решений, и ни одно из них не сработало, у меня есть что-то вроде этого, но я не знаю, правильна ли структура json, или я не отправляю ее правильно на стороне сервера, я бы хотел чтобы знать, где источник проблемы. Это ошибка: Для типа 'System.String []' не определен конструктор без параметров.

Сторона клиента

function upload() {

    var title = [];

    var files = $('#myfile').prop("files");
    var names = $.map(files, function (val) { return val.name; });

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

    var myJSON = JSON.stringify({ titulos: title });

    console.log(myJSON);

    $.ajax({
        async: true,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: "POST",
        data: myJSON,
        url: "../handlers/saveUpload.ashx",
        success: function (msg) {
            $("#title").val("Sucesso");
            $("#msg").val("Upload efectuado com sucesso.");
            $("#alerta").show();
            $("#gif").hide();
        }
    });
}

На стороне сервера

try
{
    date = DateTime.Now.ToShortDateString();
    sessao = int.Parse(context.Session["userid"].ToString());

    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.ToString());
    }
}
catch (Exception msg) { context.Response.Write(msg.Message); }

person Severiano    schedule 06.11.2013    source источник


Ответы (1)


string[] не является допустимым универсальным типом для этой операции; string не имеет конструктора без параметров, поэтому, когда сериализатор пытается new увеличить его, он терпит неудачу. Кроме того, у вас уже есть строка из 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, если это не так, десериализация не будет работать.

Надеюсь, это поможет.

person Stephen Byrne    schedule 06.11.2013