PHPackages                             mittwald/jsonmapping - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. mittwald/jsonmapping

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

mittwald/jsonmapping
====================

Library for mapping PHP objects to JSON structures

v1.5.0(6y ago)420.4k↓30%MITPHPPHP &gt;=5.6CI failing

Since Feb 23Pushed 6y ago5 watchersCompare

[ Source](https://github.com/mittwald/php-jsonmapping)[ Packagist](https://packagist.org/packages/mittwald/jsonmapping)[ RSS](/packages/mittwald-jsonmapping/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (2)Versions (10)Used By (0)

Object-to-JSON mapping framework for PHP
========================================

[](#object-to-json-mapping-framework-for-php)

[![Build Status](https://camo.githubusercontent.com/0e67aab6fafee8c007024e65ace342a0df59f63de84183e27695807e55d2c15f/68747470733a2f2f7472617669732d63692e6f72672f6d69747477616c642f7068702d6a736f6e6d617070696e672e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/mittwald/php-jsonmapping)

This package contains a framework for mapping PHP objects into arbitrary JSON structures.

Installation
------------

[](#installation)

Install this package via Composer:

```
$ composer require mittwald/php-jsonmapping

```

Usage
-----

[](#usage)

### Mapping objects

[](#mapping-objects)

The basic interface provided by this package is the interface `Mw\JsonMapping\MappingInterface`. It models a basic mapping from one value to another.

```
interface MappingInterface
{
  public funcion map($value)
}
```

The most powerful implementation of this interface is the `Mw\JsonMapping\ObjectMapping`. The `ObjectMapping` is used to map PHP objects into an array structure (which can then be used for JSON serialization):

```
$customerMapping = new ObjectMapping([
  'customerNumber' => new ObjectGetterMapping('getCustomernumber'),
  'firstName' => new ObjectGetterMapping('getFirstName')
]);
$customerJson = $customerMapping->map($customer);
```

Alternatively, use the `Mw\JsonMapping\MappingBuilder` for more concise expressions:

```
$m = new MappingBuilder();

$customerMapping = $m->struct([
  'customerNumber' => $m->getter('getCustomernumber'),
  'firstName'      => $m->getter('getFirstName'),
]);
```

On the first glance, this code is similar to the following

```
$customerJson = [
  'customerNumber' => $customer->getCustomernumber(),
  'firstName'      => $customer->getFirstName()
];
```

However, the `ObjectMapping` does more than simply calling getter methods and building an array from them. The ObjectMapping also handles null objects or getter methods not being available. So all in all, the following code is a much better equivalent for the example:

```
$customerJson = $customer != null ? [
  'customerNumber' => is_callable([$customer, 'getCustomernumber']) ? $customer->getCustomernumber() : null,
  'firstName' => is_callable([$customer, 'getFirstName']) ? $customer->getFirstName() : null,
] : null;
```

### Chaining mappings

[](#chaining-mappings)

Mappings can also be chained together:

```
$customerMapping = new ObjectMapping([
  'customerNumber' => (new ObjectGetterMapping('getCustomernumber'))->then(new IntegerMapping()),
]);
```

This can also be used to map sub-objects:

```
$customerMapping = new ObjectMapping([
  'customerNumber' => (new ObjectGetterMapping('getCustomernumber'))->then(new IntegerMapping()),
  'address'        => (new ObjectGetterMapping('getAddress'))->then(new ObjectMapping([
    'street'      => new ObjectGetterMapping('getAddress'),
    'housenumber' => new ObjectGetterMapping('getHouseNumber'),
    'country'     => new ObjectGetterMapping('getCountry')
  ]))
]);
```

Alternatively, using the `MappingBuilder`:

```
$customerMapping = $m->struct([
  'customerNumber' => $m->getter('getCustomernumber')->then($m->toInteger()),
  'address'        => $m->getterAndStruct('getAddress', [
    'street'      => $m->getter('getAddress'),
    'housenumber' => $m->getter('getHouseNumber'),
    'country'     => $m->getter('getCountry')
  ])
]);
```

### Filtering

[](#filtering)

Object mappings can be filtered for specific properties:

```
$customerMapping = new ObjectMapping([
  'customerNumber' => new ObjectGetterMapping('getCustomernumber'),
  'firstName'      => new ObjectGetterMapping('getFirstName')
]);

$filteredCustomerMapping = $customerMapping->filter('firstName');
```

Filters can also be nested, using the `FilterSet` class:

```
$filter = new FilterSet(
  'customerNumber',
  'address.country'
);

$customerMapping = $m->struct([
  'customerNumber' => $m->getter('getCustomernumber')->then($m->toInteger()),
  'address'        => $m->getterAndStruct('getAddress', [
    'street'      => $m->getter('getAddress'),
    'housenumber' => $m->getter('getHouseNumber'),
    'country'     => $m->getter('getCountry')
  ])->filter($filter->subFilter('address'))
])->filter($filter);
```

### Merging

[](#merging)

Also, object mappings can be merged together:

```
$customerMapping = new ObjectMapping([
  'customerNumber' => new ObjectGetterMapping('getCustomernumber'),
  'firstName'      => new ObjectGetterMapping('getFirstName')
]);

$advancedCustomerMapping = new ObjectMapping([
  'address' => (new ObjectGetterMapping('getAddress'))->then(new ObjectMapping([
    'street'      => new ObjectGetterMapping('getAddress'),
    'housenumber' => new ObjectGetterMapping('getHouseNumber'),
    'country'     => new ObjectGetterMapping('getCountry')
  ]))
]);

$mergedCustomerMapping = $customerMapping->merge($advancedCustomerMapping);
$mergedCustomerJson = $mergedCustomerMapping->map($customer);
```

### Putting it all together

[](#putting-it-all-together)

Find a complete example of all available mappings below; also, the [examples/](examples/) folder contains more examples:.

```
$m = new MappingBuilder();
$customerMapping = $m->struct([
  'customerNumber' => $m->getter('getCustomernumber')->then($m->toInteger()),
  'firstName'      => $m->getter('getFirstName'),
  'lastName'       => $m->getter('getLastName'),
  'invoices'       => $m->getter('getInvoices')->then($m->listing($m->struct([
    'invoiceNumber' => $m->getter('getInvoiceNumber')->then($m->toInteger()),
    'price'         => $m->getter('getPrice')->then($m->toInteger())
  ])))
]);

$addressCustomerMapping = $m->struct([
  'address' => $m->getterAndStruct('getAddress', [
    'street'      => $m->getter('getAddress'),
    'housenumber' => $m->getter('getHouseNumber'),
    'country'     => $m->getter('getCountry')
  ])
]);

$customerJson = $customerMapping
  ->merge($addressCustomerMapping)
  ->filter($userFilter)
  ->map($customer);
```

###  Health Score

34

—

LowBetter than 77% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity29

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~183 days

Recently: every ~365 days

Total

9

Last Release

2266d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5f0cf4eb3d44bff50a8f8dd5a05062c98edaf6d078f16cfae2f41caeb1a5e72a?d=identicon)[mittwald-typo3](/maintainers/mittwald-typo3)

---

Top Contributors

[![martin-helmich](https://avatars.githubusercontent.com/u/2538958?v=4)](https://github.com/martin-helmich "martin-helmich (40 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/mittwald-jsonmapping/health.svg)

```
[![Health](https://phpackages.com/badges/mittwald-jsonmapping/health.svg)](https://phpackages.com/packages/mittwald-jsonmapping)
```

###  Alternatives

[reinink/remember-query-strings

Laravel middleware that automatically remembers and restores query strings.

76598.2k3](/packages/reinink-remember-query-strings)[arielcr/numero-a-letras

Convierte un número a su valor correspondiente en letras.

51115.7k](/packages/arielcr-numero-a-letras)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
