This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Dec 15, 2023. It is now read-only.

Repository files navigation

dartson

Pub VersionBuild StatusCoverage Status

Dartson 1.0.0 is currently in alpha. The public API might be subject to change. For further details of potential breaks and a roadmap take a look at project 1.0.0.

Dartson is a dart library which converts Dart Objects into their JSON representation. It helps you keep your code clean of fromJSON and toJSON functions by providing a builder which generates the serialization methods.

Usage

Add the following lines to your pubspec.yaml in order to use dartson:

dependencies:
dartson: ^1.0.0-alpha+4
dev_dependencies:
build_runner: ^0.10.0

Dartson is using a central serializer instead of serializers for each object, therefore create a central file which refers the objects that need to be serialized:

import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<Map<String, dynamic>> serializer = _serializer$dartson;

Dartson encodes and decodes into a serializable Map (Map<String, dynamic>) by default. In order to encode and decode into a json string (in previous versions done by using Dartson.JSON) directly, call the useCodec method on the generated Dartson instance, which creates a new instance using the provided codec.

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

Private properties

It's not possible to encode / decode private properties. To set private properties, expose these within the constructor and provide a getter for encoding the entity.

Encoding / decoding lists

As of dartson >1.0.0 there are specific encodeList and decodeList methods. Because of type restrictions encodeList returns an Object and decodeList expects an Object. This should not cause any further actions when using json codec, however when working with the default serializer without any Codec, than a cast to List<Map<String, dynamic>> might be necessary when using the encodeList result.

main() {
final result = serializer.encodeList([
MyClass()..name ='test1',
MyClass()..name ='test2',
]) asList<Map<String, dynamic>>;
expect(result, allOf(isList, hasLength(2)));
expect(result[0]['name'], 'test1');
expect(result[1]['name'], 'test2');
}

Replacing entities

Sometimes entities are automatically generated and as such cannot contain any handwritten code, which could provide further logic and reduce complexity. This is where the replacement feature of dartson can help.

Here an example of an entity called Money which is replaced using MoneyImpl for replacing the operators.

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
// Imagine Money and Product couldn't be touched.classMoney {
double net;
double gross;
}
classProduct {
Money price;
String name;
}
classMoneyImplextendsMoney {
operator+(dynamic ob) {
if (obj is!Money) {
throwTypeError();
}
net += ob.net;
gross += ob.gross;
}
}
@Serializer(
entities: [
Money,
Product,
],
replacements: {
Money:MoneyImpl,
},
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Extending the serializer

Dartson supports extending serializers to provide a module approach. This is necessary to support functionality like deferred loading. This also may improve build times, so when changing an entity only a part of the serializer is regenerated.

serializer_init.dart

import'dart:convert';
import'package:dartson/dartson.dart';
import'package:some_dependency/some_class.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
SomeClass,
],
)
finalDartson<String> serializer = _serializer$dartson.useCodec(json);

serializer_second.dart

import'package:dartson/dartson.dart';
import'other_class.dart';
import'serializer_init.dart'as fs;
@Serializer(
entities: [
OtherClass,
],
)
finalDartson<String> serializer = fs.serializer.extend(_serializer$dartson);

Notice that extend provides a completely new instance of Dartson. Also the entities provided by the serializer on which extend was called can be overwritten by the entities used in the serializer passed as the argument (in this case: _serializer$dartson entities may overwrite fs.serializer entities).

Writting custom TypeTransformers

Transformers are used to encode / decode none serializable types that shouldn't be treated as objects / lists (for example DateTime).

/// A simple DateTime transformer which uses the toString() method.classDateTimeParserimplementsTypeTransformer<String, DateTime> {
// Make sure to add a constant constructor, because dartson will initiate all tranformers// as constant to improve dart2js compilation.constDateTimeParser();
DateTimedecode(String value) =>DateTime.parse(value);
Stringencode(DateTime value) => value.toString();
}

In order to use the TypeTransformer you need to register the transformer for the serializer:

import'package:dartson/dartson.dart';
import'package:dartson/transformers/date_time.dart';
import'my_class.dart';
@Serializer(
entities: [
MyClass,
],
transformers: [
DateTimeParser,
],
)
finalDartson serializer = _serializer$dartson;

Roadmap for 1.0.0 alpha/beta

  • First alpha release evaluates and tests the reuse of json_serializable (refactorings during the alpha/beta will be necessary)
  • Additional functionality from proposals will be ported
  • Looking for feedback in regards of usability from users
  • Further benchmarking of potential bottlenecks because of single point of
    the builder

Further features planned

  • See doc/proposal for general features
  • Add tool to generate serializer.dart based on serializer.decode<T>() and serializer.encode(T) usage
  • Add analyzer plugin to detect potential issues of used entities which are not present in the serializer definition

About

Dartson is a Dart library that can be used to convert Dart objects into a JSON string.

Topics

Resources

Stars

79 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages