JSONPath в Javascript такой длинный - примерно в 3000 раз длиннее, чем классический цикл

У меня проблемы с производительностью при запуске JSONPath в JavascriptПолезная библиотека Стефана Гесснера)

Со следующей структурой 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 предмета
  • «Элементы» уровня 2 содержат по 2 элемента на каждом уровне.
  • «Экземпляры» уровня 3 содержат около 100 элементов на моем конкретном элементе (остальные точно такие же)
  • 'свойства' уровня 4 содержат около 15 элементов

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

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 сохраняет свою привлекательность благодаря простому и короткому синтаксису (например, принцип поцелуя, я увлекаюсь)... но есть ли способ уменьшить задержку вычислений...? примерно в в 4000 раз больше — это впечатляет


person Damien C    schedule 03.02.2014    source источник
comment
Я не знаком с JSONPath, но вы уверены, что он не просматривает весь ваш набор данных?   -  person Tibos    schedule 03.02.2014
comment
может быть, да, но jsonpath построен с низкоуровневой функцией eval javascript ... немного сложно просмотреть JSonPath создан для поиска нескольких результатов. В моем конкретном случае мне нужен только один результат ... может быть, можно найти исправление ... я связался с автором ... оставайтесь на связи   -  person Damien C    schedule 03.02.2014


Ответы (1)


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

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

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

var xyz =$.parseJSON(document.getElementById('‹%=Hiddenfield.ClientID%>').value);

person Aakash Dhoundiyal    schedule 03.02.2014
comment
Привет aakash, я не могу использовать код asp. В моем приложении я должен запускать все это на чистом javascript. Вот почему я использую эту реализацию, сделанную Стефаном Гесснером. - person Damien C; 03.02.2014