2016-07-25 18 views
0

JavaScriptコードをデバッグして最終的に動作させるときに予期しない問題が発生しました。コントローラから取得したデータは平坦化されています。2次元配列をC#でJson文字列に変換するJavaScriptコード

[HttpPost] 
    public JsonResult CalendarCellClasses(DateTime date) 
    { 
     DateTime firstOfMonth = date.AddDays(-(date.Day - 1)); 
     DateTime lastOfMonth = firstOfMonth.AddMonths(1).AddDays(-1); 

     int additionalDaysBefore = firstOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : (int)firstOfMonth.DayOfWeek - 1; 
     int additionalDaysAfter = lastOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : 7 - (int)lastOfMonth.DayOfWeek; 
     int daysInMonth = lastOfMonth.Day; 
     int totalDays = additionalDaysBefore + additionalDaysAfter + daysInMonth; 
     int numWeeks = totalDays/7; 

     DateTime firstDayInSeries = firstOfMonth.AddDays(-additionalDaysBefore); 
     DateTime lastDayInSeries = lastOfMonth.AddDays(additionalDaysAfter); 

     DateTime current = firstDayInSeries; 

     string[,] dates = new string[numWeeks,7]; 

     for (int week = 0; week < numWeeks; week++) 
     { 
      for (int day = 0; day < 7; day++) 
      { 
       dates[week, day] = TrafficData.GetTrafficDate(current).CSSClass; 
       current = current.AddDays(1); 
      } 
     } 

     return Json(dates); 
    } 

ご覧のとおり、このメソッドを呼び出すJavaScript関数に渡す文字列[、]があります。

jQuery(document).ready(function() { 
    var calendar = $('#Trafikkalender'); 
    var date = $('#selectedDate').val(); 
    var param = { date: date } 
    var url = $('#calArrayPostUrl').data('url'); 
    $.post(url, param, function(data) { 
     var body = calendar.find('tbody'); 

     //var rows = body.getElementsByTagName('tr'); 
     var rows = body.find('tr'); 

     for (var i = 0; i < rows.length; i++) { 
      //var cols = rows[i].getElementsByTagName('td'); 
      var cols = $(rows[i]).find('td'); 
      for (var j = 0; j < cols.length; j++) { 
       var col = $(cols[j]); 
       col.addClass(data[i][j]); 
      } 
     } 
    }); 
}); 

が、デバッガのデータによれば、35個の要素を持つ配列であり、そしてそれらは、一次元アレイとして順序付けられているように見えます。私はJsonの文字列を返すときに何か間違ったことをしたのか、2dimの配列はjavascriptのものではありませんか?

+0

は、ジャグ配列を試してみてください。 2次元配列はIEnumerableとして解決され、実装はそれを単一の配列として扱います。 – pwas

+0

ギザギザの配列を聞いたことがありません – inifus

+0

nevermindは、ギザギザが何であるかを発見しました。今すぐ働きます:)ありがとう – inifus

答えて

0

jsonは多かれ少なかれテキストファイルです。私は思う、あなたはjsonにあなたの配列をコンパイルすることができます。

だけ

while allarrayentries 
{ 
enter new line into json; 
} 

を行い、その後、JSONを完了するには、最後の行を追加し、開始時に行を追加します。

0

データを渡すために、配列の代わりにクラスモデルを使用します。

public class Dates{ 
    public DateTime current { get; set; } 
    public int number { get; set; } 
} 

とJavaScriptで、あなたはこのようにアクセスすることができます:シリアル化の代わりに、シリアライザに建てられたため

for (var i = 0; i < rows.length; i++) { 
    var cols = $(rows[i]).find('td'); 
    for (var j = 0; j < cols.length; j++) { 
     var col = $(cols[j]); 
     col.addClass(data[i]["current"]); 
     col.addClass(data[i]["number"]); 
    } 
} 
0

使用JSON.NET。それは、組み込みの1つはひどくこれらの配列をシリアライズするようです(そしてJSON.NETもずっと高速です)。ここで

は、このための基本的な実装です:

public class JsonNetResult : JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 
     if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
      throw new InvalidOperationException("JSON GET is not allowed"); 

     HttpResponseBase response = context.HttpContext.Response; 
     response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType; 

     if (this.ContentEncoding != null) 
      response.ContentEncoding = this.ContentEncoding; 
     if (this.Data == null) 
      return; 

     if (Data != null) 
     { 
      var writer = new JsonTextWriter(response.Output); 

      var serializer = JsonSerializer.Create(new JsonSerializerSettings 
      { 
       ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
       DateFormatHandling = DateFormatHandling.IsoDateFormat 
      }); 

      serializer.Serialize(writer, Data); 

      writer.Flush(); 
     } 
    } 
} 

とコントローラのJSON関数をオーバーライド:

protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) 
    { 

     return new JsonNetResult 
     { 
      Data = data, 
      ContentType = contentType, 
      ContentEncoding = contentEncoding, 
      JsonRequestBehavior = behavior 
     }; 
    } 

    protected override JsonResult Json(object data, string contentType, Encoding contentEncoding) 
    { 
     return new JsonNetResult 
     { 
      Data = data, 
      ContentType = contentType, 
      ContentEncoding = contentEncoding 
     }; 
    } 

は続きを読む:http://www.newtonsoft.com/json

関連する問題