I am not thrilled about this one.
At this point I have no less than 7 active Dart projects and libraries, most of which rely on the
dart:json library to one degree or another. Unfortunately, dart:json is going away, replaced by similar functionality (but different APIs) in dart:convert. Since I want to continue to use my 7+ dart libraries and projects, I need to convert them… to dart:convert.Actually, I think it makes sense to use the option #2 for most of the packages—at least in the first change. Option #2 is the Dart folks trying to make our lives a little easier in the transition. It breaks out a JSON package that supports the same API as the old
dart:json library. This should make for fewer code changes, which I appreciate.So I
find all mentions of dart:json in Dart files that are contained in those 7 projects:➜ repos find \
hipster-mvc \
plummbur-kruk \
ice-code-editor \
dart-dirty \
ctrl-alt-foo \
dart-comics \
csdart \
-type f \
-name '*.dart' \
-exec grep dart:json {} \; \
-print
import 'dart:json' as JSON;
hipster-mvc/test/test_server.dart
import 'dart:json' as JSON;
hipster-mvc/test/hipster_mvc_test.dart
import 'dart:json' as JSON;
hipster-mvc/lib/hipster_sync.dart
import 'dart:json' as JSON;
plummbur-kruk/test/browser_test.dart
import 'dart:json' as JSON;
...There are a lot more of those.The changes are pleasantly straight-forward. I have to include the
json package as a dependency in each project's pubspec.yaml:name: dirty version: 0.1.0 description: Dart Dirty is a persistent, server-side HashMap - a dirt simple nosql DB. author: Chris StromThen, wherever thehomepage: https://github.com/eee-c/dart-dirty dependencies: json: any unittest: any
dart:html library was imported in each package's codebase, I replace it with the package equivalent:library dirty; import 'dart:io'; import 'dart:async'; import 'dart:collection'; import 'package:json/json.dart' as JSON; // ...Finally, I update my dependencies with
pub update to get the json package:➜ dart-dirty git:(master) ✗ pub update Resolving dependencies............ Downloading json 0.6.9 from hosted... Dependencies updated!With that, I am ready to try things out. Thankfully, I have decent test coverage in most of my Dart code, so I can be reasonably confident that the
json package is being exercised and is working as desired:➜ dart-dirty git:(master) ✗ ./test/run.sh .... All 9 tests passed. dartanalyzer lib/dirty.dart Analyzing lib/dirty.dart... No issues found.Hooray for an easy upgrade path!
That approach works fine for each of my packages. I am curious about the
dart:convert option, I so switch to that in Hipster MVC. I remove the newly added json package from the list of dependencies for that package:name: hipster_mvc version: 0.2.10 description: Dart-based MVC framework homepage: https://github.com/eee-c/hipster-mvc dependencies: browser: ">=0.6.19 <0.6.20" unittest: ">=0.6.19 <0.6.20" plummbur_kruk: ">=0.0.4 <0.0.5"I then replace the import of the
json package with dart:convert:library hipster_sync; import 'dart:html'; import 'dart:async'; import 'dart:convert'; //...The only downside to
dart:convert is that I have to replace the familiar JSON.stringify() and JSON.parse() with JSON.encode() and JSON.decode(). On the plus side, they are drop-in replacements: static parseJson(json) {
if (json.isEmpty) return {};
return JSON.decode(json);
}That works just fine. All of my tests pass and all of my code passes dartanalyzer analysis. Still, the decode/encode names combined with the newness of dart:convert lend an air of not-fully-baked to this change. I will leave it in place in Hipster MVC, but I am in no rush to make the change in my other packages. And I have the feeling that I will stick with the json package and its familiar stringify() and parse() functions in new code—at least until dart:convert has been around for a good long time.Day #860


