Rand Stats

JSON::Mask

zef:raku-community-modules

Actions Status Actions Status Actions Status

NAME

JSON::Mask - JSON filtering

SYNOPSIS

use JSON::Mask;

# Select keys "a", "b", and "c".
mask('a,b,c', %data);

my $mask = compile-mask('a,b,c');
mask($mask, %data1);

DESCRIPTION

Allows to filter JSON-like data so it's suitable for public consumption. The pattern describes the schema, and the module trims the extra data.

Basic syntax

To select keys, list them in a comma-separated string:

# Select keys "a", "b", and "c".
mask('a,b,c', %data);

To select all keys except a few, negate them:

# Select all the keys that aren't "a" or "b".
mask('-a,-b', %data);

To select subkeys, use parentheses:

# Keeps only "a", and in it only its subkeys "b" and "c".
mask('a(b,c)', %data);

You can of course combine them:

# Select everything but "password", but only keep the
# "name" and "email" subkeys from "profile".
mask('-password,profile(name,email)', %data);

You can quote a key if it contains "special" characters:

# Select everything but "password" and "password-confirmation".
mask('-password,-"password-confirmation"', %data);

Compilation

If you want to reuse masks, you can pre-compile them:

my $mask = compile-mask('a,b,c');
mask($mask, %data1);
mask($mask, %data2);
mask($mask, %data3);

Array handling

The module handles arrays without you needing to do anything: a mask will be applied recursively on each element of the array.

my @data =
  %(id => 1, name => "First Volume"),
  %(id => 2, name => "Second Adventure"),
  %(id => 3, name => "Final Countdown")
;
mask('id', @data); # Select key "id" in each sub-hash

Error handling

The module ignores missing keys. It will however throw an exception if a nested key ("a(b,c)") is not actually Associative (or Positional).

AUTHOR

vendethiel

Source can be located at: https://github.com/raku-community-modules/JSON-Mask . Comments and Pull Requests are welcome.

COPYRIGHT AND LICENSE

Copyright 2020 Edument AB

Copyright 2024 The Raku Community

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.