ribs_json 1.0.0-dev.16 copy "ribs_json: ^1.0.0-dev.16" to clipboard
ribs_json: ^1.0.0-dev.16 copied to clipboard

Library provides fully typed JSON parsing, encoding and decoding. Also supports streaming parsing.

example/example.dart

// ignore_for_file: avoid_print
import 'package:ribs_core/ribs_core.dart';
import 'package:ribs_json/ribs_json.dart';

/// A simple domain model for our example.
class SoftwareProject {
  final String name;
  final String language;
  final int stars;
  final Option<String> description;

  SoftwareProject(this.name, this.language, this.stars, this.description);

  @override
  String toString() =>
      'SoftwareProject(name: $name, language: $language, stars: $stars, description: $description)';
}

/// Define a Codec for our domain model using the product syntax.
/// This acts as both a Decoder and an Encoder.
final projectCodec = (
  ("name", Codec.string),
  ("language", Codec.string),
  ("stars", Codec.integer),
  ("description", Codec.string.optional()),
).product(SoftwareProject.new, (p) => (p.name, p.language, p.stars, p.description));

Future<void> main() async {
  // Basic Parsing & Decoding
  const rawJson = '''
  {
    "name": "ribs",
    "language": "dart",
    "stars": 100,
    "description": "Functional programming in Dart"
  }
  ''';

  print('Parsing and Decoding:');
  Json.parse(rawJson).fold(
    (err) => print('  Parsing failed: $err'),
    (json) => projectCodec
        .decode(json)
        .fold(
          (err) => print('  Decoding failed: $err'),
          (project) => print('  Decoded: $project'),
        ),
  );

  // Encoding
  print('\nEncoding:');
  final myProject = SoftwareProject('My Awesome App', 'Dart', 42, const Some('Just a sample'));
  final encodedJson = projectCodec.encode(myProject);
  print('  Encoded JSON: ${encodedJson.printWith(Printer.spaces2)}');

  // Manual Traversal (HCursor)
  print('\n3. Manual Traversal with Cursors:');
  final complexJson = Json.parse('''
  {
    "metadata": {
      "updatedAt": "2024-02-22T12:00:00Z",
      "tags": ["functional", "type-safe", "dart"]
    }
  }
  ''').getOrElse(() => Json.Null);

  final secondTag = complexJson.hcursor
      .downField('metadata')
      .downField('tags')
      .downN(1)
      .decode(Decoder.string);

  print('  Second tag: ${secondTag.getOrElse(() => "Not found")}');

  // Async / Streaming Parsing
  print('\nAsync / Streaming Parsing:');

  // A single JSON string containing an array of various types
  const jsonArrayString = '[1, "two", true, {"four": 4}, [5]]';

  // Simulate a network stream of string chunks
  final stream = Stream.fromIterable([
    jsonArrayString.substring(0, 10),
    jsonArrayString.substring(10, 20),
    jsonArrayString.substring(20),
  ]);

  // Use JsonTransformer to parse the stream incrementally
  try {
    final parsedElements =
        await stream.transform(JsonTransformer.strings(AsyncParserMode.unwrapArray)).toList();

    print('  Successfully parsed ${parsedElements.length} independent elements from the stream:');
    for (final item in parsedElements) {
      // Formatted printind using ribs_json Printer
      print('    - ${item.printWith(Printer.noSpaces)}');
    }
  } catch (e, st) {
    print('  Caught error: $e\n$st');
  }
}
0
likes
0
points
145
downloads

Publisher

unverified uploader

Weekly Downloads

Library provides fully typed JSON parsing, encoding and decoding. Also supports streaming parsing.

Homepage
Repository (GitHub)
View/report issues

Topics

#json #codec #parsing #functional-programming

License

unknown (license)

Dependencies

meta, ribs_core

More

Packages that depend on ribs_json