Skip to content

HexaField/jsonpath-object-transform

 
 

Repository files navigation

jsonpath-object-transform

Fork of https://github.com/hirenj/jsonpath-object-transform, which is a fork of https://github.com/dvdln/jsonpath-object-transform

Transform an object literal using JSONPath.

Pulls data from an object literal using JSONPath and generate a new objects based on a template. Each of the template's properties can pull a single property from the source data or an array of all results found by its JSONPath. When pulling an array of data you can also supply a subtemplate to transform each item in the array.

JSONPath is like XPath for JavaScript objects. To learn the syntax, read the documentation for the jsonpath-plus package on npm and the original article by Stefan Goessner.

Notes on special tokens in templates:

  • $ always refers to the ROOT of the input, regardless of depth.
  • @ refers to the CURRENT item/context when evaluating inside subtemplates or scripts.

Usage

import transform from '@hexafield/jsonpath-object-transform'

const template = {
  foo: [
    '$.some.crazy',
    {
      bar: '$.example'
    }
  ]
}

const data = {
  some: {
    crazy: [
      {
        example: 'A'
      },
      {
        example: 'B'
      }
    ]
  }
}

const result = transform(data, template)

Result:

{
  foo: [
    {
      bar: 'A'
    },
    {
      bar: 'B'
    }
  ]
}

Method

jsonPathObjectTransform(data, template)

Where data and template are both a plain Object. Returns the transformed Object.

Template Objects

Your template will be an object literal that outlines what the resulting object should look like. Each property will contain a JSONPath String or Array depending on how many properties from the source data you want to assign to the generated object.

Pulling a Single Property

{
  destination: '$.path.to.source'
}

Use a String on your template property to assign a single object returned from your JSONPath. If your path returns multiple results then only the first is used.

Example

const template = {
  foo: '$.example'
}

const data = {
  example: 'bar'
}

Result:

{
  foo: 'bar'
}

Pulling an Array of Properties

{
  destination: ['$.path.to.sources']
}

Use an Array containing a single String to assign all results returned from your JSONPath.

Example

const tempalte = {
  foo: ['$..example']
}

const data = {
  a: {
    example: 'bar'
  },
  b: {
    example: 'baz'
  }
}

Result:

{
  foo: ['bar', 'baz']
}

Transform Items Returned in Array

{
  destination: ['$.path.to.sources', { item: '$.item.path' }]
}

Use an Array with a String and an Object to assign all results returned from your JSONPath and transform each of the objects with a subtemplate. Inside the subtemplate, use @ to access the current item; use $ to access the root.

Example

const template = {
  foo: ['$.a, $.b..example', {
    bar: '@.demo'
  }]
}

const data = {
  a: {
    example: {
      demo: 'baz'
    }
  },
  b: {
    example: {
      demo: 'qux'
    }
  }
}

Result:

{
  foo: [{ bar: 'baz' }, { bar: 'qux' }]
}

About

Transform an object literal using JSONPath.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 58.6%
  • TypeScript 40.7%
  • HTML 0.7%