Что такое библиотека JavaScript или модуль, который может обновлять json на основе jsonpath? - PullRequest
0 голосов
/ 06 февраля 2019

Я использовал некоторую библиотеку Java, чтобы достигнуть этого прежде.Я подумал, что поскольку json более присущ JavaScript и Java, найти библиотеку, которая делает это, довольно просто.Но на удивление нет.

Пример того, что я ищу: приведен объект Json:

 {
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      {
        "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      {
        "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

и Jsonpath вроде:

 '$..author'

Я могу вызвать функцию JavaScript, котораяпринимает JsonObject, JsonPath и newValue (Shakespeare) в качестве входных параметров и изменяет значение всех вхождений JSONPATH на новое значение, например, на

 {
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Shakespeare",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "category": "fiction",
        "author": "Shakespeare",
        "title": "Sword of Honour",
        "price": 12.99
      },
      {
        "category": "fiction",
        "author": "Shakespeare",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      {
        "category": "fiction",
        "author": "Shakespeare",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

Любые предложения?

1 Ответ

0 голосов
/ 06 февраля 2019

Попробуйте использовать пакет jsonpath npm.

используйте метод apply для изменения значений объекта JSON и возврата узлов.Вам нужно будет добавить метод, который будет изменять значение в соответствии с путем от каждого узла.

const _ = require('lodash');
var jp = require('jsonpath');
const data = {
"store": {
  "book": [ 
    {
      "category": "reference",
      "author": "Nigel Rees",
      "title": "Sayings of the Century",
      "price": 8.95
    }, {
      "category": "fiction",
      "author": "Evelyn Waugh",
      "title": "Sword of Honour",
      "price": 12.99
    }, {
      "category": "fiction",
      "author": "Herman Melville",
      "title": "Moby Dick",
      "isbn": "0-553-21311-3",
      "price": 8.99
    }, {
       "category": "fiction",
      "author": "J. R. R. Tolkien",
      "title": "The Lord of the Rings",
      "isbn": "0-395-19395-8",
      "price": 22.99
    }
  ],
  "bicycle": {
    "color": "red",
    "price": 19.95
  }
}
  }
    var nodes = jp.apply(data, '$..author', function(value) { return value.toUpperCase() });
    // [
    //   { path: ['$', 'store', 'book', 0], value: 'NIGEL REES' },
    //   { path: ['$', 'store', 'book', 1], value: 'EVELYN WAUGH' },
    //   { path: ['$', 'store', 'book', 2], value: 'HERMAN MELVILLE' },
    //   { path: ['$', 'store', 'book', 3], value: 'J. R. R. TOLKIEN' }
    // ]

    function chnageValueByPath(object, path, value) {
       if(Array.isArray(path) && path[0] === '$') {
            const pathWithoutFirstElement = path.slice(1);
            _.set(object, pathWithoutFirstElement, value);
       }
    }

    function changeValuesByPath(object, nodes, lastPropertyName) {
        nodes.forEach((node)=> {
            chnageValueByPath(object, node.path.concat(lastPropertyName), node.value);
        })

        return object;
    }

    const result = changeValuesByPath(data, nodes, 'author');
    console.log(result);
...