Code Monkey home page Code Monkey logo

cherrypie.js's Introduction

#cherrypie.js NPM Build Status Coverage Status

cherrypie.js is a dead simple, yet powerful JSON-to-rich-model converter which helps you to convert your incoming JSON object into a more convenient model object and vice versa with the help of a so called model-description.

With cherrypie.js you're able to get the primitive "namespaced" object values as well as "computed" properties which depend on a number of values from the received JSON, as well as reduce/desolate the "rich" model object back to the object which is expected at the backend.

There are a few "switches" and "directives" which are unique to each modelDescription and can be used to instruct cherrypie how to process the incoming JSON object. All model descriptions are nestable (as each model description could have a infinite number of nested __children).

Directive Type Description
__namespace String The "namespace" of the incoming JSON (if the values you want are "nested") - __namespace can be nested
__children Object An object which holds at least one child model description - __children can be nested
__serializable [String] The list of serializable properties when model.serialize is called
__transferKeys Boolean Tell cherrypie.js to only process the described properties and take others "as is"
__ignoredKeys [String] Use this directive in conjunction with __transferKeys so that you don't have to declare and endless amount of properties only to have 1 or 2 properties skipped

##JSON-to-Rich-Model Examples

###Parse values from JSON

Received JSON:

{
  "session": {
    "user": {
      "name": "Bruce Wayne",
      "nick": "Batman"
    }
  }
}

Model Description:

{
  __namespace: 'session.user',
  name: 'name',
  nick: 'nick',
  __serializable: ['name', 'nick']
}

Populated Model:

{
  name: 'Bruce Wayne',
  nick: 'Batman',
  __serializable: ['name', 'nick']
}

###Parse computed values from JSON

Received JSON:

{
  "session": {
    "user": {
      "firstName": "Bruce",
      "lastName": "Wayne",
      "nick": "Batman",
      "comments": [
        {
          commentId: 'c01',
          commentText: 'some text'
        },
        {
          commentId: 'c02',
          commentText: 'another text'
        }
      ]
    }
  }
}

Model Description:

{
  __namespace: 'session.user',
  firstName: 'firstName',
  lastName: 'lastName',
  name: function () {
    return this.firstName + ' ' + this.lastName;
  },
  comments: function (preparedOrigin, namespaceExtractor, populate) {
    var comments = preparedOrigin.comment,
        commentDescription = {
          id: 'commentId',
          text: 'commentText'
        },
        preparedComments = [];

        if(comments && comment.length > 0) {
          comments.forEach(function (comment) {
            preparedComments.push(populate(commentDescription, comment);
          });
        }

        return preparedComments;
  }
  nick: 'nick',
  __serializable: ['firstName', 'lastName', 'nick']
}

Populated Model:

{
  firstName: 'Bruce',
  lastName: 'Wayne',
  name: 'Bruce Wayne',
  nick: 'Batman',
  comments: [
    {
      id: 'c01',
      text: 'some text'
    },
    {
      id: 'c02',
      text: 'another text'
    }
  ]
  __serializable: ['firstName', 'lastName', 'nick']
}

###Parse computed values from JSON with minimal model description

Received JSON:

{
  "session": {
    "user": {
      "firstName": "Bruce",
      "lastName": "Wayne",
      "nick": "Batman"
    }
  }
}

Model Description:

{
  firstName: 'firstName',
  lastName: 'lastName',
  name: function () {
    return this.firstName + ' ' + this.lastName;
  },
  nick: 'nick',
}

Populated Model:

{
  firstName: 'Bruce',
  lastName: 'Wayne',
  name: 'Bruce Wayne',
  nick: 'Batman'
}

###Parse properties using child model-descriptions from JSON

Received JSON:

{
  "session": {
    "user": {
      "firstName": "Bruce",
      "lastName": "Wayne",
      "nick": "Batman",
      "userComments": [
        {
          commentId: 'c01',
          commentText: 'some text'
        },
        {
          commentId: 'c02',
          commentText: 'another text'
        }
      ]
    }
  }
}

Model Description:

// be aware that the `__children` property names must match the "new" property names of the model
// and not the one of the original JSON!
{
  __namespace: 'session.user',
  firstName: 'firstName',
  lastName: 'lastName',
  name: function () {
    return this.firstName + ' ' + this.lastName;
  },
  comments: 'userComments',
  __children: {
    comments: {
      id: 'commentId',
      text: 'commentText'
    }
  },
  nick: 'nick',
  __serializable: ['firstName', 'lastName', 'nick']
}

Populated Model:

{
  firstName: 'Bruce',
  lastName: 'Wayne',
  name: 'Bruce Wayne',
  nick: 'Batman',
  comments: [
    {
      id: 'c01',
      text: 'some text'
    },
    {
      id: 'c02',
      text: 'another text'
    }
  ]
  __serializable: ['firstName', 'lastName', 'nick']
}

###Parse and process only the described properties and take the others "as is"

Make use of the __transferKeys switch in order to tell cherrypie.js to process the descriptions given by the modelDescription and transfer the keys which are not explicitly described "as is" from the origin object.

Received JSON:

{
  "session": {
    "user": {
      "firstName": "Bruce",
      "lastName": "Wayne",
      "nick": "Batman",
      "userComments": [
        {
          commentId: 'c01',
          commentText: 'some text'
        },
        {
          commentId: 'c02',
          commentText: 'another text'
        }
      ]
    }
  }
}

Model Description:

{
  __namespace: 'session.user',
  __transferKeys: true,
  fullName: function (preparedOrigin) {
    return preparedOrigin.firstName + ' ' + preparedOrigin.lastName;
  },
  comments: 'userComments',
  __children: {
    comments: {
      __transferKeys,
      id: 'commentId'
    }
  }
}

Populated Model:

{
  firstName: 'Bruce',
  lastName: 'Wayne',
  fullName: 'Bruce Wayne',
  nick: 'Batman',
  comments: [
    {
      id: 'c01',
      commentText: 'some text'
    },
    {
      id: 'c02',
      commentText: 'another text'
    }
  ]
}

##Rich-Model-to-JSON Examples ###Reduce a "rich" model

Model Description:

{
  firstName: 'firstName',
  lastName: 'lastName',
  name: function () {
    return this.firstName + ' ' + this.lastName;
  },
  nick: 'nick',
  __serializable: ['firstName', 'lastName', 'nick']
}

Reduced/desolated Model:

{
  firstName: 'Bruce',
  lastName: 'Wayne',
  nick: 'Batman'
}

##Contribute If you want to contribute, feel free to raise an issue or open a pull request - I'm glad if my idea fits your needs ;)

cherrypie.js's People

Contributors

herom avatar madmg avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.