2010-07-31 2 views
0

Эй. У меня есть этот файл javascript, который я выхожу из Интернета, и состоит из нескольких больших массивов javascript. Поскольку я являюсь разработчиком .net, я бы хотел, чтобы этот массив был доступен через C#, поэтому мне интересно, есть ли какие-либо дополнения в коделекс или любые другие методы, которые я мог бы использовать, чтобы превратить массив javascript в массив aC#, который я может работать с моим кодом C#.превратить массив javascript в массив 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. Получить файл JavaScript в моем C# коде, сделав httprequest for

  2. вставьте его вместе с кодом я сделал сам

  3. из C# вызовите выполнения на Java-функции самопроизведённых функций, которая превратит яваскрипт массива в JSON (с помощью json.org/json2.js) и выводить его в новый файл

  4. получить новый файл в C# разбор JSON с DataContractJsonSerializer в результате, мы надеемся, что приводит к переменным # массиву

это звук выполнимо для вас, ребята?

+0

Вы хотите сказать, что массив находится в формате JSON? Это может помочь, если вы покажете небольшой пример того, что у вас есть. –

+1

Используйте свой редактор, чтобы превратить квадратные скобки в фигурные скобки. –

+0

, к сожалению, не отформатирован JSON, это массив javascript. Я отредактировал основную запись, чтобы привести пример – Jakob

ответ

1

Я не являюсь перед компьютером с C# прямо сейчас, поэтому я не могу полностью попробовать это.

Что вы собираетесь нужно сделать @Jakob следующий:

  1. Написать парсер, который будет загрузить файл и сохранить его в памяти.
  2. Для каждого раздела, который вы хотите «разбор» в массиве C# (например, zonearray), вам необходимо настроить границы, чтобы начать поиск и завершить поиск файла. Пример: Мы знаем, что zonearray начинает строить массив двумя линиями после zonearray[i] = new Array(1); и заканчивается на zonearray.sort().
  3. Таким образом, с этими ограничениями мы можем прокручивать каждую строку между синтаксисом и анализировать массив C#. Это достаточно просто, я думаю, что вы можете понять. Вам также нужно будет помнить о субиндексе.
  4. Повторите это 2-3 для каждого массива, который вы хотите проанализировать (zonearray, roomarray ..etc).

Если вы не можете достаточно выяснить как закодировать границы или как разобрать строку и складывать их в массивы, я мог бы написать что-то завтра (даже если это праздник в Канаде).

EDIT: Следует отметить, что для этого нельзя использовать какой-либо JSON-синтаксический анализатор; вы должны написать свой собственный. На самом деле это не так сложно сделать, вам просто нужно разбить его на небольшие шаги (сначала выясните, как прошивать каждую строку и находить правильные «границы»).

НТН

EDIT: Я только что провел ~ 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; 
} 
+0

Я очень ценю ваше предложение, особенно вашу помощь, хотя вы в отпуске, я хочу подчеркнуть вас и заняться вашим праздником. Однако я, как вы уже упоминаете, немного не знает, как определить границы, поэтому методы не станут слишком хрупкими для обработки динамического файла такого типа, поэтому я думаю, что начну с шага 1 и увижу если это приведет меня куда угодно. – Jakob

+0

@Jakob - Смотрите мое редактирование выше ... – TheCloudlessSky

+0

@TheCloudlessSky - Большое вам спасибо - я в это мгновение и возвращаюсь к вам с золотой медалью, статуей и обелиском, названным в честь вас – Jakob

0

Если я правильно понял ваш вопрос, вы спрашиваете, можете ли вы выполнить код JavaScript с C#, а затем передать результат (который в вашем примере будет объектом JavaScript) в код C#.

Ответ: Конечно, это теоретически возможно, но для выполнения JavaScript вам понадобится фактический интерпретатор JavaScript. Вы должны будете найти его или написать самостоятельно, но учитывая, что JavaScript является полномасштабным языком программирования, и писать переводчики для такого большого и полнофункционального языка программирования - это довольно серьезное мероприятие, я подозреваю, что вы не найдете полное готовое решение, и вы не сможете написать его, если ваша преданность не будет выше, чем у всех других поклонников C# -and-JavaScript во всем мире.

Однако, с небольшим количеством обмана, вы можете иметь возможность принудить существующего интерпретатора JavaScript делать то, что вы хотите. По очевидным причинам все браузеры имеют такой интерпретатор, в том числе Internet Explorer, доступ к которому можно получить с помощью элемента управления WinForms WebBrowser. Таким образом, вы можете попробовать следующее:

  • Попросите C# код сгенерировать файл HTML, содержащий JavaScript загруженный плюс некоторые JavaScript, который превращает его в JSON (вы, кажется, уже нашли то, что делает это) и выводит его в браузере.
  • Откройте этот HTML-файл в элементе управления WebBrowser, выполните его JavaScript, а затем прочитайте содержимое веб-сайта, теперь, когда он содержит результат выполненного JavaScript.
  • Включите JSON в массив C#, используя DataContractJsonSerializer, как вы предложили.

Это довольно крутой способ сделать это, но это лучшее, что я могу придумать.

Я должен удивляться, почему вы извлекаете файл JavaScript из Интернета в первую очередь. Что генерирует этот файл JavaScript? Независимо от того, что генерирует его, наверняка может генерировать некоторые правильно читаемые материалы (например, XML-файл)? Если он не генерируется, а написан человеком, то почему он написан на JavaScript вместо XML, CSV или какого-либо другого формата данных? Надеемся, что с этими мыслями вы сможете найти решение, которое не требует JavaScript-трюки, как указано выше.

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# Array.

EDIT:
Осмотрев немного, я нашел Json.NET: http://json.codeplex.com/
Есть также много одних и те же вопросы, на которые запрашивают Stackoverflow то же самое.

Смежные вопросы