A big thanks to Nicolas Pouillard, who co-authored data-object (as well as some of the underlying libraries like attempt) for coming up with many of the great ideas here.
Before you get worried, this has nothing to do with object-oriented. The term “object” here refers to a JSON object, which basically means a data type which can represent three things:
- Sequences (or lists)
- Mappings (or dictionaries)
This format happens to be an incredibly useful things, and the goal of data-object is to provide the Object data type in one place where other libraries can use it, and thus easily exchange data with other libraries. So far, this library has been used for:
- data-object-json: a wrapper around json-b for JSON parsing/emitting
- data-object-yaml: a binding to the libyaml C library. (Note: the C source code is included in the package, so you don’t need to have it installed separately on your system.)
- json2yaml: a simple utility program for converting JSON to YAML files (I was shocked that I couldn’t find something like this elsewhere).
- It is also playing a prominent role in the Yesod web framework to provide such features as automatic string escaping, JSON output and interfacing with HStringTemplate
Hopefully that gives you an idea that this library is useful. Before rolling your own data type to do basically the same thing, please consider using this library instead.
Overview of design choices
The datatype itself is incredibly simple; the important points are what go along with it.
- The Object datatype is polymorphic in both the key and value. You can make String->String objects, Int->String, or anything else you like.
- This library depends on convertible-text, which provides generic conversion type classes.
- There is a template haskell function included to automatically generate a number of instances.
- There are three specific aliases provided for Object in their own modules: TextObject, StringObject and ScalarObject.
What, no code samples?
Sorry, not this time. If you want to see example code that uses the data-object library, I recommend data-object-json and json2yaml (data-object-yaml has a lot of C library cruft).
Also, this library is still young, so I’m very much open to suggestions.