将javascript数组转换为c#数组

时间:2010-07-31 12:41:22

标签: c# javascript arrays

嘿。我有这个javascript文件,我正在下网,它基本上包括几个大型的javascript数组。由于我是.net开发人员,我希望通过c#可以访问此数组,所以我想知道是否有任何codeplex贡献或任何其他方法可以用来将javascript数组转换为ac#array我可以使用我的c#代码。

像:

var roomarray = new Array(194);
var modulearray = new Array(2055);
var progarray = new Array(160);
var staffarray = new Array(3040);
var studsetarray = new Array(3221);

 function PopulateFilter(strZoneOrDept, cbxFilter) {
    var deptarray = new Array(111);
    for (var i=0; i<deptarray.length; i++) {
        deptarray[i] = new Array(1);
    }
    deptarray[0] [0] = "a/MPG - Master of Public Governance";
    deptarray[0] [1] = "a/MPG - Master of Public Governance";
    deptarray[1] [0] = "a/MBA_Flex MBA 1";
    deptarray[1] [1] = "a/MBA_Flex MBA 1";
    deptarray[2] [0] = "a/MBA_Flex MBA 2";
    deptarray[2] [1] = "a/MBA_Flex MBA 2";
    deptarray[3] [0] = "a/cand.oecon";
    deptarray[3] [1] = "a/cand.oecon";

等等

这是我在忽略建议之后的想法:

  1. 通过为其设置httprequest来检索我的c#代码中的javascript文件

  2. 将它与我自己制作的一些代码粘贴在一起

  3. 来自c#的
  4. 调用javascript函数自制函数的执行,将javascript数组转换为json(在json.org/json2.js的帮助下),并将其输出到新文件

    < / LI>
  5. 在c#中检索新文件,使用DataContractJsonSerializer解析json,结果希望产生一个c#array

  6. 对你们这听起来有用吗?

3 个答案:

答案 0 :(得分:1)

我现在不在c#的电脑前,所以我无法完全尝试这个。

@Jakob需要做的事情如下:

  1. 编写将下载文件并将其存储在内存中的解析器。
  2. 对于要“解析”到c#数组的每个部分(例如zonearray),您需要设置边界以开始搜索并结束搜索文件。示例:我们知道zonearray开始在zonearray[i] = new Array(1);之后的两行开始构建数组,并以zonearray.sort()结束。
  3. 因此,通过这些边界,我们可以在每个线之间压缩并解析C#数组。这很简单,我认为你可以搞清楚。您还需要记住子索引。
  4. 对要解析的每个数组(zonearrayroomarray等)重复2-3次。
  5. 如果你不能完全找出如何来编码边界或如何解析这些行并将它们转储到数组中,我明天可能会写一些东西(即使这是一个假期)在加拿大)。

    编辑:应该注意的是,你不能使用一些JSON解析器;你必须自己写。这并不是那么困难,你只需要将其分解成小步骤(首先要弄清楚如何压缩每一行并找到正确的“边界”)。

    HTH

    编辑:我只花了大约20分钟为你写这篇文章。它应该解析文件并将每个数组加载到List<string[]>。我已经对它进行了大量评论,因此你可以看到发生了什么。如果您有任何疑问,请不要犹豫。干杯!

    private class SearchBound
    {
        public string ArrayName { get; set; }
        public int SubArrayLength { get; set; }
        public string StartBound { get; set; }
        public int StartOffset { get; set; }
        public string EndBound { get; set; }
    }
    
    public static void Main(string[] args)
    {
        //
        // NOTE: I used FireFox to determine the encoding that was used.
        // 
    
        List<string> lines = new List<string>();
    
        // Step 1 - Download the file and dump all the lines of the file to the list.
        var request = WebRequest.Create("http://skema.ku.dk/life1011/js/filter.js");
        using (var response = request.GetResponse())
        using(var stream = response.GetResponseStream())
        using(var reader = new StreamReader(stream, Encoding.GetEncoding("ISO-8859-1")))
        {
            string line = null;
    
            while ((line = reader.ReadLine()) != null)
            {
                lines.Add(line.Trim());
            }
    
            Console.WriteLine("Download Complete.");
    
        }
    
        var deptArrayBounds = new SearchBound
        {
            ArrayName = "deptarray",                    // The name of the JS array.
            SubArrayLength = 2,                         // In the JS, the sub array is defined as "new Array(X)" and should always be X+1 here.
            StartBound = "deptarray[i] = new Array(1);",// The line that should *start* searching for the array values.
            StartOffset = 1,                            // The StartBound + some number line to start searching the array values.
                                                        // For example: the next line might be a '}' so we'd want to skip that line.
            EndBound = "deptarray.sort();"              // The line to stop searching.
        };
    
        var zoneArrayBounds = new SearchBound
        {
            ArrayName = "zonearray",
            SubArrayLength = 2,
            StartBound = "zonearray[i] = new Array(1);",
            StartOffset = 1,
            EndBound = "zonearray.sort();"
        };
    
        var staffArrayBounds = new SearchBound
        {
            ArrayName = "staffarray",
            SubArrayLength = 3,
            StartBound = "staffarray[i] = new Array(2);",
            StartOffset = 1,
            EndBound = "staffarray.sort();"
        };
    
        List<string[]> deptArray = GetArrayValues(lines, deptArrayBounds);
        List<string[]> zoneArray = GetArrayValues(lines, zoneArrayBounds);
        List<string[]> staffArray = GetArrayValues(lines, staffArrayBounds);
        // ... and so on ...
    
        // You can then use deptArray, zoneArray etc where you want...
    
        Console.WriteLine("Depts: " + deptArray.Count);
        Console.WriteLine("Zones: " + zoneArray.Count);
        Console.WriteLine("Staff: " + staffArray.Count);
        Console.ReadKey();
    
    }
    
    private static List<string[]> GetArrayValues(List<string> lines, SearchBound bound)
    {
        List<string[]> values = new List<string[]>();
    
        // Get the enumerator for the lines.
        var enumerator = lines.GetEnumerator();
    
        string line = null;
    
        // Step 1 - Find the starting bound line.
        while (enumerator.MoveNext() && (line = enumerator.Current) != bound.StartBound)
        {
            // Continue looping until we've found the start bound.
        }
    
        // Step 2 - Skip to the right offset (maybe skip a line that has a '}' ).
        for (int i = 0; i <= bound.StartOffset; i++)
        {
            enumerator.MoveNext();
        }
    
        // Step 3 - Read each line of the array.
        while ((line = enumerator.Current) != bound.EndBound)
        {
    
            string[] subArray = new string[bound.SubArrayLength];
    
            // Read each sub-array value.
            for (int i = 0; i < bound.SubArrayLength; i++)
            {
    
                // Matches everything that is between an equal sign then the value 
                // wrapped in quotes ending with a semi-colon.
                var m = Regex.Matches(line, "^(.* = \")(.*)(\";)$");
    
                // Get the matched value.
                subArray[i] = m[0].Groups[2].Value;
    
                // Move to the next sub-item if not the last sub-item.
                if (i < bound.SubArrayLength - 1)
                {
                    enumerator.MoveNext();
                    line = enumerator.Current;
                }
            }
    
            // Add the sub-array to the list of values.
            values.Add(subArray);
    
            // Move to the next line.
            if (!enumerator.MoveNext())
            {
                break;
            }
        }
    
        return values;
    }
    

答案 1 :(得分:0)

如果我理解你的问题,你就会问你是否可以从C#中执行JavaScript代码,然后将结果(在你的示例中是一个JavaScript Array对象)传递给C#代码。

答案是:当然理论上可行,但你需要一个实际的JavaScript解释器来执行JavaScript。你必须找到一个或自己编写,但鉴于JavaScript是一种成熟的编程语言,为这么大的全功能编程语言编写解释器是一项艰巨的任务,我怀疑你找不到一个完整的现成解决方案,除非你的奉献精神超过全球所有其他顽固的C#和JavaScript风扇,否则你也无法写一个。

然而,有一点技巧,你可能能够强制现有的JavaScript解释器来做你想要的。出于显而易见的原因,所有浏览器都有这样的解释器,包括Internet Explorer,您可以使用WinForms WebBrowser控件进行访问。因此,您可以尝试以下方法:

  • 让您的C#代码生成一个HTML文件,其中包含您下载的JavaScript以及一些将其转换为JSON的JavaScript(您似乎已经找到了可以执行此操作的内容)并将其输出到浏览器中。
  • 在WebBrowser控件中打开该HTML文件,让它执行JavaScript,然后回读网站内容,现在它包含已执行JavaScript的结果。
  • 按照建议使用DataContractJsonSerializer将JSON转换为C#数组。

这是一种非常迂回的方式,但这是我能想到的最佳方式。

我不得不怀疑,为什么你首先要从网上检索一个JavaScript文件。什么生成这个JavaScript文件?无论生成什么,肯定可以生成一些适当的可读内容(例如XML文件)?如果它不是由人类生成的,那么为什么用JavaScript而不是XML,CSV或其他数据格式编写?希望通过这些想法,您可以找到一个不需要JavaScript欺骗的解决方案。

答案 2 :(得分:0)

最简单的解决方案是只执行生成数组的Javascript函数。包含一个使其成为JSON(http://www.json.org/js.html)的函数。之后,向服务器发出XMLHttpRequest(AJAX),并从那里将JSON提取到自定义类。

如果我可以使用jQuery,这里是一个所需的Javascript示例:

var myJSONText = JSON.stringify(deptarray);
(function($){
    $.ajax({
        type: "POST",
        url: "some.aspx",
        data: myJSONText,
        success: function(msg){
            alert( "Data Saved: " + msg );
        }
    });
})(jQuery);

现在只需要一些代码就可以将JSON字符串转换为C#数组。

编辑:
环顾四周后,我找到了Json.NET:http://json.codeplex.com/
在Stackoverflow上也有很多相同的问题。