Используйте JSON.NET для сериализации данных JSON — С# — extjs

что мне нужно сделать, это загрузить мою круговую диаграмму данных, созданную с помощью extjs4, с данными из моей базы данных, хранилище принимает эти данные, поэтому мне нужно вернуть свои данные в формате, который выглядит следующим образом:

var data = [{ name: "Low", data1: "20", data2: "54", data3: "63", data4: "12" },
 { name: "Moderate", data1: "2", data2: "74", data3: "13", data4: "25" },
 { name: "Critical", data1: "42", data2: "17", data3: "3", data4: "20" },
 { name: "High", data1: "25", data2: "14", data3: "23", data4: "52"}];

поэтому я пытаюсь сделать это на С# с помощью json.net, я создал class.cs и отправил свои запросы, чтобы получить нужные мне данные:

namespace charts
{
public class lineChartClass
{
    public String piedata()
    {     
{//..my queries in here..//}
   double[] data = new double[4] ;
        //data = "{ name: \"Low\", data1: " + lowtotal + "}" + ",{ name: \"Moderate\", data1: " + moderatetotal + "}" + ",{ name: \"Critical\", data1: " + criticaltotal + "}" + ",{ name: \"High\", data1: " + hightotal + "}";
       data[0]=lowtotal;
       data[1] = moderatetotal;
       data[2] = criticaltotal;
       data[3] = hightotal;
        return data;



    }//eo piedata
}
    public class ChartItem
    {
        public string Name { get; set; }

        public string Data1 { get; set; }


    }

}

и создал мой handler.ashx для преобразования в json:

namespace charts {
public class lineChartData : IHttpHandler
{
    static string ConvertToJson()
    {
     List<ChartItem> chartItems = new List<ChartItem>();

        chartItems.Add(new ChartItem() { Name = "Low", Data1 = json[0].ToString() });
        chartItems.Add(new ChartItem() { Name = "Moderate", Data1 = json[1].ToString() });
        chartItems.Add(new ChartItem() { Name = "Critical", Data1 = json[2].ToString() });
        chartItems.Add(new ChartItem() { Name = "High", Data1 = json[3].ToString() });
        string result = new JavaScriptSerializer().Serialize(chartItems);
        return result;

    }
} 
}

то в моем chart.js я называю это так:

var obj= new lineChartData();

window.store1 = Ext.create('Ext.data.JsonStore', {
fields: ['name', 'dat1', 'data2', 'data3', 'data4'],
data: obj.ConvertToJson()//generateData()
});

но я получаю эту ошибку:

Uncaught ReferenceError: lineChartData is not defined
lineChartData.ashxGET http://localhost/lineChartData.ashx?proxy 500 (Internal Server Error)

я только начинаю с С# и extjs и не знаю, как использовать json.net

заранее спасибо за ваше время


person Armance    schedule 15.07.2011    source источник
comment
Код catch (Exception ex) { throw ex; } злой: не перехватывайте исключения, которые вы не можете обработать или обернуть; и никогда повторно не создавать исключения.   -  person Eamon Nerbonne    schedule 15.07.2011
comment
Я добавил его после того, как получил ошибку, удаление ничего не меняет, спасибо   -  person Armance    schedule 15.07.2011
comment
Он изменяет трассировку стека и, таким образом, усложняет отладку.   -  person Eamon Nerbonne    schedule 15.07.2011


Ответы (2)


Почему бы вам не использовать стандартные версии средств сериализации JSON как на стороне клиента, так и на стороне сервера. В ASP.NET есть класс JavaScriptSerializer и В JavaScript есть объект JSON (встроенный в ECMAScript 5 и плагин для более старых версий, написанный Дугласом Крокфордом) .

Чтобы преобразовать объект в JSON на сервере, вы можете использовать:

string objectJson = new JavaScriptSerializer().Serialize(yourObject);

Чтобы сериализовать объект в JSON на стороне клиента, вы можете использовать:

string objectJson = JSON.stringify(yourObject);

Чтобы десериализовать строку JSON в объект на стороне клиента, вы можете использовать:

var yourObject = JSON.parse(objectJson);

Таким образом, у вас может быть класс для представления вашего элемента диаграммы на сервере:

public class ChartItem
{
    public string Name {get;set;}

    public string Data1 {get;set;}

    public string Data2 {get;set;}

    public string Data3 {get;set;}

    public string Data4 {get;set;}
}

и используйте его в своем методе ConvertToJson следующим образом:

List<ChartItem> chartItems = new List<ChartItem>();
// add as many item as you wish to this list
chartItems.Add(new ChartItem(){ Name = "Something", Data1 = "data1", Data2 = "data2", Data3 = "data3", Data4 = "data4 });
string result = new JavaScriptSerialize().Serialize(chartItems);
return result;
person Saeed Neamati    schedule 15.07.2011
comment
я не возражаю, мне просто нужно, чтобы это работало любым возможным способом, и если это проще, и вы можете указать мне, как это сделать, это было бы здорово - person Armance; 15.07.2011
comment
Ну, JSON существует уже много лет, и тысячи разработчиков использовали его. Поэтому его структура полностью зрела как на стороне сервера, так и на стороне клиента. Смотрите обновление :) - person Saeed Neamati; 15.07.2011
comment
ok.so, где я могу добавить это в свой код? заменить converttojson() на JavaScriptSerializer().Serialize()? пожалуйста, потерпите меня, полный новичок здесь - person Armance; 15.07.2011
comment
Однако JsonSerializer не так надежен и не так функционален, как Json.NET. Если он неправильно сериализует нулевой символ как константный нуль (например) и отбрасывает информацию о часовом поясе из сериализованных структур DateTime. Так что использование библиотеки — не такой уж и странный выбор, особенно если учесть, что она позволяет несколько чище вызывать код. - person Eamon Nerbonne; 15.07.2011
comment
вы имели в виду JavaScriptSerializer(), а не JavaScriptSerialize() - person Armance; 15.07.2011
comment
Мне наконец удалось устранить ошибку, теперь я вижу диаграмму, но она пуста! string result = new JavaScriptSerialize().Serialize(chartItems); возвращает ноль! есть идеи, почему? - person Armance; 21.07.2011

Вы правильно добавили их в свой web.config:

<httpHandlers>
  <add verb="GET" path="lineChartData.ashx" type="charts.lineChartData"/>
</httpHandlers>
person Mrchief    schedule 15.07.2011