2014-02-03 4 views
2

меня получил проблемы с производительностью JSONPath работать в JavascriptStephan Goessner Usefull Library)JSONPath в Javascript так долго - около 3000 раз больше, чем классическая петля

со следующей структурой JSON.

[ 
    { 
    id:1, 
    name: "lorem", 
    elements: 
    [ 
     { 
      id:101, 
      date: Fri Jan 31 2014 18:03:41 GMT+0100 (Paris, Madrid), // Javascript Date Object, 
      instances: [ 
       { 
        id: 1001, 
        properties: [ 
         { 
          code: 'ipsum lens', 
          id: 1001, 
          values: [ 
           "value1", 
           "value2", 
           ... 
           // less than 5 values 
          ] 
         }, 
         ... ,/between 20 to 40 items 
        ] 
       }, 
       ... // About 100 items 
      ] 
     }, 
     ... // Less than 5 items 
    ], 
    meta: [ 
     { 
      id: 10000, 
      code: 'codeabc', 
      property1: true, 
      property2: false, 
      property3: 2939, 
     }, 
     ... // between 20 to 40 items 
    ] 
    }, 
    ... // 4 items 
] 

Вот величины:

  • level1 содержит 4 элемента
  • LEVEL2 'элементов' содержит 2 элемента на каждом уровне
  • 'экземпляры' LEVEL3 содержит около 100 пунктов в моем конкретных элемент (другие совершенно одинаковы)
  • level4 'properties' содержит около 15 наименований

С JSON путем, следующий код дать мне время ответа закрыт на 4 секунды в хроме

var startDate = new Date(); 
var searchedValue = jsonPath(
    myJSONStore, 
    "$.[?(@.name == 'myelementname')].elements[?(@.id == 100)].date" 
)[0]; 
console.log(date) 
console.log("Get in " + ((new Date().getTime() - startDate.getTime())/1000) + "s") 

Я нашел эту задержку очень долго, учитывая малое количество данных. Я попытался также этот классический код, без jsonPath

var startDate = new Date(); 
var searchedValue = null; 
for(i in myJSONStore) { 
    if (myJSONStore[i].name == 'myelementname') { 
     for (j in myJSONStore[i].elements) { 
      if (myJSONStore[i].elements[j].id == 100) { 
       var date = myJSONStore[i].elements[j].date; 
       break; 
      } 
     } 
    } 
} 
console.log(date) 
console.log("Get in " + ((new Date().getTime() - startDate.getTime())/1000) + "s") 

На этот раз, это ТОЛЬКО 1 Наталья принимает миллисекунды.

JsonPath держит Привлекательность из-за его простой и короткий синтаксис (как в kiss principle, я наркоман) ... но есть способ уменьшить задержку расчета ...? около Впечатляющий 4000 раз

+0

Я не знаком с JSONPath, но вы уверены, что не просматриваете весь ваш набор данных? – Tibos

+0

Возможно, да, но jsonpath построен с низким уровнем eval javascript-функции ... немного сложно просмотреть JSonPath построен, чтобы найти несколько результатов. В моем конкретном случае мне нужен только один результат ... может быть, исправление может быть найдено ... Я связался с автором ... поддерживаю связь –

ответ

-1

1) Используйте нижеприведенный код на странице aspx.cs.

string path = "Ваш путь к файлу JSON"; Hiddenfield.Value = File.ReadAllText (путь);

2) После этого попробуйте использовать нижеприведенный код на странице aspx, т.е. получая объект json через скрытое поле.

var xyz = $. ParseJSON (document.getElementById ('<% = Hiddenfield.ClientID%>'). Value);

+0

Привет, акаш, я не могу использовать asp-код. В моем приложении я должен запустить все это в чистом javascript. Вот почему я использую эту реализацию, сделанную Стефаном Гесснером –