Как разобрать или запросить сложный JSON в JavaScript - PullRequest
2 голосов
/ 07 сентября 2011

Можно ли выполнять сложные запросы к объекту JSON? Я открыт для решений JavaScript или jQuery, чем проще, тем лучше. Я представляю какой-то функциональный язык программирования, похожий на LINQ или SQL.

Я не предпочитаю никакие сторонние библиотеки или надстройки.

ОБНОВЛЕНИЕ
Судя по ранним ответам, дополнение будет необходимо. В этом случае я предпочитаю дополнение, которое не требует процесса установки. То, что развертывается при публикации программного обеспечения (например, jQuery), прекрасно (например, наборы файлов * .js).

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

К тому времени, когда вы взаимодействуете с ним, это не «объект JSON», это объект JavaScript. («Объекты JSON» существуют только в терминах нотации данных.) Сам по себе JavaScript не имеет каких-либо продвинутых конструкций функционального программирования, поэтому вам понадобятся сторонние библиотеки для такого рода вещей. У JavaScript в основном просто есть средства доступа к свойствам, оператор для "есть ли у этого объекта свойство с таким именем?" (in, hasOwnProperty) и, начиная с 5-го издания (пока широко не поддерживается), некоторые удобные функции для работы с массивами, такие как forEach, every, map, filter и т. П.

3 голосов
/ 07 сентября 2011
1 голос
/ 30 января 2014

Используйте JSON.stringify и replacer обратный вызов для достижения этой цели:

function replacer(match, offset, fullstring)
  {
  return replacer.str;
  }

replacer.str = "\u0022filterValues\u0022:[\u0022hi\u0022,\u0022bye\u0022]"; /* Use DOM node value */

var foo = JSON.stringify({
"Region": {
    "filterField": "kw_Region",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"ApplicationName": {
    "filterField": "kw_ApplicationName",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"IssueType": {
    "filterField": "kw_IssueType",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"Outage": {
    "filterField": "kw_Outage",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"Priority": {
    "filterField": "kw_Priority",
    "filterValues": [
        "aa",
        "bb"
    ]
}
}).replace(/"filterValues[^\]]+./g, replacer)

Вот некоторая документация по двум методам JSON для сериализации и преобразования, stringify и parse:

JSON.parse (source, reviver)

Этот метод анализирует текст JSON для создания объекта или массива.Может выдавать исключение SyntaxError.

Необязательный параметр reviver - это функция, которая может фильтровать и преобразовывать результаты.Он получает каждый из ключей и значений, и его исходное значение используется вместо исходного значения.Если он возвращает то, что получил, то структура не изменяется.Если он возвращает неопределенное значение, то член удаляется.

В конечном счете, reviver вызывается с пустой строкой и самым верхним значением, чтобы разрешить преобразование самого верхнего значения.Обязательно правильно обработайте этот случай, обычно возвращая указанное значение, иначе JSON.parse вернет undefined.

 if (k === "") return v

JSON.stringify (value, replacer, space)

Метод stringify создает текст JSON из значения JavaScript.Если значение является объектом или массивом, структура будет посещаться рекурсивно, чтобы определить сериализацию каждого члена или элемента.Структура не должна быть циклической.

Когда значение объекта найдено, если объект содержит метод toJSON, будет вызван его метод toJSON и результат будет зашифрован.Метод toJSON не сериализуется: он возвращает значение, представленное парой имя / значение, которое должно быть сериализовано, или не определено, если ничего не нужно сериализовать.Методу toJSON будет передан ключ, связанный со значением, и он будет привязан к объекту, содержащему ключ.

Вы можете указать дополнительный метод замены.Он будет передан ключ и значение каждого члена, с этим связаны с содержащим объектом.Значение, возвращаемое вашим методом, будет сериализовано.Если ваш метод возвращает значение undefined, то элемент будет исключен из сериализации.

Если параметр replacer является массивом, то он будет использоваться для выбора элементов, подлежащих сериализации.Он фильтрует результаты так, что только члены с ключами, перечисленными в массиве replacer, являются строковыми.

Значения, которые не имеют представлений JSON, такие как undefined или functions, не будут сериализованы.Такие значения в объектах будут отброшены;в массивах они будут заменены на нуль.Вы можете использовать функцию замены, чтобы заменить их значениями JSON.JSON.stringify (undefined) возвращает неопределенное значение.

Необязательный параметр space производит строковое значение, которое заполняется разрывами строк и отступами, чтобы его было легче читать.

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

var alias = {"Clark":"","phone":""};

function kryptonite(key)
   {
   var replacement = {};
   for(var cursor in this)
     {
     if(cursor in alias)
       replacement[cursor] = this[cursor]
     }

   return replacement;
   }

var contact = {
               "Clark":"Kent",
               "Kal El":"Superman",
               "phone":"555-7777"
              }

contact.toJSON = kryptonite;
var foo = JSON.stringify(contact) // "{"Clark":"Kent","phone":"555-7777"}"

Ссылки

0 голосов
/ 07 сентября 2011

хмм ... YQL делает такие вещи, но это будет третья сторона.

вы можете отфильтровать массив с помощью метода jQuery $.grep(array,filterfn)

 var newArr = $.grep(oldArr,function(elInArray,index){
   return elInArray.key === somevalue;
 });

и, конечно, вы можете использовать регулярное выражение там, если хотите, или использовать более сложные условия, такие как проверка нескольких ключей, ключей внутри ключей, массивов внутри ключей и т. Д.

...