【问题标题】:How to pass a multidimension array to javascript from c#?如何从 c# 将多维数组传递给 javascript?
【发布时间】:2012-01-29 18:29:52
【问题描述】:

我正在使用一个 JQuery 图表插件,它使用多维数组接收数据点

    var line1 = [['23-May-2008', 1578.55], ['20-Jun-2008', 566.5], 
['25-Jul-2008', 480.88], ['22-Aug-2008', 509.84]];

如何从 c# 返回格式如上的数据?我已经尝试生成一个与输出匹配的字符串,但它不起作用...

StringBuilder sb = new StringBuilder();

        foreach (Stats s in perfData)
        {          
            sb.Append("['" + String.Format("{0:MM-dd-yyyy}", p.Date) + "'], " + "[" + p.Value +"],");
        }

        string data = sb.ToString();
        data += data.TrimEnd(new[] { ',' });
        data = "[" + data + "]";

【问题讨论】:

    标签: c# javascript multidimensional-array


    【解决方案1】:

    您可以使用任何 JSON 序列化器(DataContractJsonSerializerJavaScriptSerializer)将您的对象转换为 javascript 格式。但我个人更喜欢Json.Net

    List<object[]> array2D = new List<object[]>() { 
        new object[] { DateTime.Now.AddDays(-1000), 1578.55 }, 
        new object[] { DateTime.Now.AddDays(-2000), 566.5 },
        new object[] { DateTime.Now.AddDays(-3000), 480.88 },
        new object[] { DateTime.Now.AddDays(-4000), 509.84 } 
    };
    
    string jsonstr =  JsonConvert.SerializeObject(array2D,new MyDateTimeConvertor());
    
    
    public class MyDateTimeConvertor : Newtonsoft.Json.Converters.DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new Exception("Not implemented yet");
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue(((DateTime)value).ToString(@"dd-MMM-yyy"));
        }
    }
    

    并且输出是一个有效的 javascript 对象

    [["04-May-2009",1578.55],["08-Aug-2006",566.5],["12-Nov-2003",480.88],["15-Feb-2001",509.84]]
    

    【讨论】:

    • 您知道如何使用 json 序列化程序来做到这一点吗?
    • 如果你问的是日期时间格式,不,这就是我使用 Json.Net 的原因,因为我提供了很大的灵活性。
    • @L.B 我使用了 JavascriptSerializer。之前它在 jquery 中返回了一个正确的数组。但现在它只返回一组字符串,而不是 jquery 中的数组格式。使用 JavascrtipSerializer 和 JSON 有很大区别吗?
    【解决方案2】:

    使用来自System.Web.Extensions 程序集的JavaScriptSerializer

            var data = perfData.Select(p => 
                new object[] { String.Format("{0:MM-dd-yyyy}", p.Date), p.Value });
    
            var serializer = new JavaScriptSerializer();
            var json = serializer.Serialize(data);
    

    【讨论】:

    • 这似乎以正确的格式返回数据 [["01-19-2012",2.60]],但它抛出了一个对象,对象异常。
    • 这个异常是在哪里抛出的?在客户端javascript代码中?
    • 我在玩它,输出是正确的。该插件还有一些其他奇怪的问题,无法使用 ajax 数据,但完全相同的数据适用于页面加载...
    【解决方案3】:

    我认为您应该尝试使用 JSON 助手(JavaScript Object Notation)来进行这种操作。我找到了那个链接,希望对你有帮助http://weblogs.asp.net/hajan/archive/2010/07/23/javascriptserializer-dictionary-to-json-serialization-and-deserialization.aspx

    【讨论】:

      【解决方案4】:
      1. 不应该像下面这样来生成你需要的东西吗?
      2. 这是无效的 JSON,因此请检查您的插件是否采用 JSON,如果是,则在 C# 中使用 JSONserializer。

        foreach (Stats s in perfData)
        {          
            sb.Append("['" + String.Format("{0:MM-dd-yyyy}", p.Date) +","+  p.Value +"],");
        }
        
        string data = sb.ToString();
        data += data.TrimEnd(new[] { ',' });
        data = "[" + data + "]";
        

      【讨论】:

      • 插件采用多维数组。那不是和json不一样吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多