Lightweight JSON serialization library for plain, mutable classes.

Used as a dartson replacement.

Important note

From 0.10.0 upwards the generated juicer files will have a .juicer.dart suffix instead of .pb.dart, because it seems support has arrived for having custom suffices. If you still want to use the old version add a version constraint in your pubspec.yaml file:

  juicer: '^0.9.0'

If you're ready to use the new version:

  juicer: '^0.10.0'


import "dart:convert";
import "package:juicer/juicer_vm.dart";
import "package:juicer/metadata.dart";

class Party {
  String key;
  String name;
  String country;
  String city;
  @Property(name: "street_address")
  String streetAddress;
  String zip;

  @Property(ignore: true)
  String get address => "$name\n$streetAddress\n$city\n$country";

void main() {
  Juicer juicer = juiceClasses([Party]);
  Map asMap = juicer.encode(new Party()
    ..key = "company_1234556"
    ..name = "Random Ltd."
    ..country = "Sovereignland"
    ..city = "Capitalcity"
    ..streetAddress = "1 Main Street"
    ..zip = "11111");
  // the map is encodable to JSON (you can also use encodeJson/decodeJson)
  // create a copy by decoding the map
  Part copy = juicer.decode(asMap, (_) => Party());


A Juicer object “knows” how to encode or decode some classes into maps, and handles all the JSON primitives as well. There are two modes of operation:

  • using the build system for every dart file which exports other dart files with juiced classes it will generate the class-specific encoder classes for all those classes and a global Juicer juicer variable for those classes in the generated file (see https://github.com/skawa-universe/juicer_gen_test for the code generation in action)
  • using mirrors it can create Juicer objects on the fly

In both cases all classes must be marked with the @juiced annotation (from metadata.dart), the mirrors implementation (juicer_vm.dart) will map non-juiced classes as well in some cases.

Mirrors based implementation

The mirrors implementation provides the following functions:

  • createJuicerForLibraries: juices all the libraries, or a filter can be provided which will filter based on the package URI
  • juiceLibraries: juices the libraries with a specific name (for example you have a comm library with all these classes you can call juiceLibraries(["comm"]) to get a juicer for all these)
  • juiceClasses: juices a list of classes, the default behavior is to juice all classes and the referenced classes regardless of whether they have @juiced annotation

Code generator based implementation

For every dart file that exports other dart files containing @juiced classes a .juicer.dart file will be generated.