2010-07-31 6 views
0

안녕하세요. 나는 웹에서 벗어나고있는 자바 스크립트 파일을 가지고 있으며 기본적으로 몇 가지 큰 자바 스크립트 배열로 구성되어있다. 내가 .net 개발자이기 때문에이 배열을 C#을 통해 액세스 할 수 있기를 바랍니다. 코드 플렉스가 있는지 또는 다른 방법을 사용하여 javascript 배열을 aC# 배열로 바꿀 수 있는지 궁금합니다. 내 C# 코드에서 작동 할 수 있습니다.자바 스크립트 배열을 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"; 

이 내가 제안 내려다 보이는 후에 생각하고 무엇을 :을 만들어 내 C# 코드에서 자바 스크립트 파일을 검색

  1. 을 그것에 대한 httprequest

  2. 붙여 함께 일부 코드 난 (json.org/json2.js 도움으로) JSON으로 자바 어레이를 설정하는 자바 스크립트 함수 selfmade 함수 호출을 실행 # C에서 자신

  3. 을 만들고, 새 파일로 출력하여

가 너희들에게 행할 소리 않습니다 교류 # 배열의 결과로 희망 결과 DataContractJsonSerializer와 JSON을 구문 분석하는 C#에서 새 파일을 검색?

+0

배열이 JSON 형식으로되어 있는지 확인 하시겠습니까? 당신이 갖고있는 것에 대한 작은 예를 보여 주면 도움이 될 것입니다. –

+1

편집기를 사용하여 대괄호를 중괄호로 바꿉니다. –

+0

불행히도 형식이 JSON이 아니며, 자바 스크립트 배열입니다. 예제를 제공하기 위해 메인 포스트를 편집했습니다. – Jakob

답변

1

전 지금 C#을 사용중인 컴퓨터 앞에 있지 않으므로 완전히 시도 할 수는 없습니다.

  1. 파일을 다운로드하여 메모리에 저장하는 파서를 쓰기 : 당신이 @Jakob을 할 필요 해요 무엇

    는 다음과 같습니다.

  2. C# 배열로 "구문 분석"하려는 각 섹션 (예 : zonearray)에 대해 검색을 시작하고 파일 검색을 끝내기 위해 경계를 설정해야합니다. 예 : zonearrayzonearray[i] = new Array(1); 다음의 두 줄을 배열 시작으로 구성하고 zonearray.sort()으로 끝나는 것을 알고 있습니다.
  3. 그래서 이러한 경계를 사용하여 C# 배열 사이의 각 줄을 압축하고 C# 배열을 구문 분석 할 수 있습니다. 이것은 충분히 간단합니다. 당신이 알아낼 수 있다고 생각합니다. 기억하셔야 할 하위 색인을 추적해야합니다.
  4. 구문 분석하려는 각 어레이에 대해 2-3을 반복하십시오 (zonearray, roomarray 등).

당신이 아주이 휴일 캐나다에서 여기에 비록 (내일 뭔가를 쓸 수있을 것, 경계를 코딩 방법이나 선을 구문 분석하고 배열로 덤프하는 방법 을 알아낼 수없는 경우).

편집 : 여기에 일부 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; 
} 
+0

귀하의 제안, 특히 귀하의 도움에 감사드립니다. 나가 너를 강조하고 너의 휴일을 채택하고 싶다는 것을 의미한다. 그러나 나는 여러분이 언급했듯이 경계가 어떻게 정의되어야하는지에 관해서는 단서가 없기 때문에이 방법의 동적 파일을 다루기에는 너무 연약 해지지 않으므로 1 단계부터 시작하여 그것이 나를 이끌면 어디든지. – Jakob

+0

@Jakob - 위의 편집을 참조하십시오 ... – TheCloudlessSky

+0

@TheCloudlessSky - 감사합니다. 바로 이것에 대해 알아 보겠습니다. 황금 메달과 동상, 오벨 리스크를 가지고 바로 연락 드리겠습니다. – Jakob

0

질문을 올바르게 이해하면 이 C#에서 JavaScript 코드를 실행 한 다음 결과 (예 : JavaScript Array 객체)를 C# 코드로 전달할 수 있는지 묻는 중입니다.

대답은 이론적으로 가능하지만 JavaScript를 실행하려면 실제 JavaScript 인터프리터가 있어야합니다. 하나를 찾거나 직접 작성해야하지만, 자바 스크립트는 완전한 프로그래밍 언어이며 그러한 크고 완전한 기능을 갖춘 프로그래밍 언어에 대한 인터프리터를 작성하는 것은 상당한 일이며, 나는 당신이 완벽한 기성품 솔루션을 제공 할 수 없으며 전 세계 다른 다이 하드 C# 및 JavaScript 팬의 헌신을 능가하지 않는 한 작성할 수도 없습니다.

그러나 약간의 속임수를 사용하면 은 기존 JavaScript 인터프리터를 강요하여 원하는 것을 수행 할 수 있습니다. 명백한 이유로, 모든 브라우저에는 WinForms WebBrowser 컨트롤을 사용하여 액세스 할 수있는 Internet Explorer를 포함한 통역사가 있습니다. 따라서 다음을 시도해 볼 수 있습니다.

  • C# 코드에서 다운로드 한 JavaScript가 포함 된 HTML 파일과 JSON으로 변환하는 일부 JavaScript (사용자가 이미이 작업을 수행 한 것으로 나타남)를 출력하고 출력합니다. 브라우저에서
  • WebBrowser 컨트롤에서 해당 HTML 파일을 열고 JavaScript를 실행 한 다음 실행 된 JavaScript의 결과가 포함되었으므로 웹 사이트의 내용을 다시 읽습니다.
  • 제안대로 DataContractJsonSerializer을 사용하여 JSON을 C# 배열로 바꿉니다.

이것은 꽤 환상적인 방법이지만, 내가 생각할 수있는 가장 좋은 방법입니다.

왜 웹에서 JavaScript 파일을 검색하는지 궁금합니다. 이 JavaScript 파일을 생성하는 것은 무엇입니까? 생성물이 무엇이든 확실하게 대신 올바르게 읽을 수있는 자료 (예 : XML 파일)를 생성 할 수 있습니까? 인간에 의해 생성되었지만 작성되지 않은 경우 XML, CSV 또는 다른 데이터 형식 대신 JavaScript로 작성되는 이유는 무엇입니까? 위와 같은 JavaScript 속임수를 요구하지 않는 솔루션을 찾을 수 있기를 희망합니다.

0

가장 쉬운 솔루션은 배열을 만드는 Javascript 함수를 실행하는 것입니다. 거기에 JSON (http://www.json.org/js.html)을 만드는 함수를 포함하십시오. 그런 다음 서버에 XMLHttpRequest (AJAX)를 만들고 여기에서 JSON을 사용자 정의 클래스로 추출한다. 내가 jQuery를 사용할 수있는 경우

, 여기에 필요한 자바 스크립트의 예 :

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

만 이제 C#을 배열로 JSON 문자열을 추출하는 몇 가지 코드가 필요합니다.

편집 : http://json.codeplex.com/
같은 요청에 유래에서 같은 많은 질문이 있습니다
조금 둘러보고 후, 나는 Json.NET이 발견했다.

관련 문제