bson
Version, currently 0.3.624 versions
- 0.3.6latestJul 26, 2024
- 0.3.5not indexedJun 22, 2026
- 0.3.4not indexedJun 22, 2026
- 0.3.3not indexedJun 22, 2026
- 0.3.2not indexedJun 22, 2026
- 0.3.1not indexedJun 22, 2026
- 0.3.0not indexedJun 22, 2026
- 0.2.10not indexedJun 22, 2026
- 0.2.9not indexedJun 22, 2026
- 0.2.8not indexedJun 22, 2026
- 0.2.7not indexedJun 22, 2026
- 0.2.6not indexedJun 22, 2026
- 0.2.5not indexedJun 22, 2026
- 0.2.4not indexedJun 22, 2026
- 0.2.3not indexedJun 22, 2026
- 0.2.2not indexedJun 22, 2026
- 0.2.1not indexedJun 22, 2026
- 0.2.0not indexedJun 22, 2026
- 0.1.5not indexedJun 22, 2026
- 0.1.4not indexedJun 22, 2026
- 0.1.3not indexedJun 22, 2026
- 0.1.2not indexedJun 22, 2026
- 0.1.1not indexedJun 22, 2026
- 0.1.0not indexedJun 22, 2026
github.com/elbywan/bson.cr
A pure Crystal Implementation of the BSON Specification.
20 stars
1 dependent
License: MIT
Installation
# Add this to your shard.yml
dependencies:
bson:
github: elbywan/bson.cr
version: ~> 0.3.6Then run:
shards installshard.yml
- Crystal
>= 0.35.0, < 2.0.0- License
- MIT
- Author
- elbywan <elbywan@hotmail.com>
Dependencies
This version declares no dependencies.
README
<div align="center">
<img src="icon.svg" width="128" height="128" />
<h1>bson.cr</h1>
<h3>A pure Crystal implementation of the <a href="http://bsonspec.org">BSON specification</a>.</h3>
<a href="https://github.com/elbywan/bson.cr/actions/workflows/crystal.yml"><img alt="Crystal CI" src="https://github.com/elbywan/bson.cr/actions/workflows/crystal.yml/badge.svg"></a>
<a href="https://github.com/elbywan/bson.cr/tags"><img alt="GitHub tag (latest SemVer)" src="https://img.shields.io/github/v/tag/elbywan/bson.cr"></a>
<a href="https://github.com/elbywan/bson.cr/blob/master/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/elbywan/bson.cr"></a>
</div>
## Reliability
This library passes the official corpus tests located in the [`mongodb/specifications`](https://github.com/mongodb/specifications) repository.
*A few [minor](https://github.com/elbywan/bson.cr/tree/master/spec/corpus) modifications have been made to the tests to comply with Crystal specifics.*
## Installation
1. Add the dependency to your `shard.yml`:
```yaml
dependencies:
bson:
github: elbywan/bson.cr
```
2. Run `shards install`
## API
[Full API documentation is hosted here.](https://elbywan.github.io/bson.cr/BSON.html)
## Usage
```crystal
require "bson"
```
### Constructors
```crystal
# Create a BSON instance from a NamedTuple…
bson = BSON.new({
hello: "world"
})
# …or a Hash…
bson = BSON.new({
"hello" => "world"
})
# …or a hex binary representation…
bytes = "160000000268656c6c6f0006000000776f726c640000".hexbytes
bson = BSON.new(bytes)
# …or an IO…
bson = BSON.new(IO::Memory.new bytes)
# …or JSON data
bson = BSON.from_json(%({
"hello": "world"
}))
# The BSON binary representation is stored in the data property
puts bson.data.hexstring
# => 160000000268656c6c6f0006000000776f726c640000
```
### Append and fetch values
```crystal
bson = BSON.new({
hello: "world"
})
# Append values
bson["name"] = BSON.new({
first_name: "John",
last_name: "Doe"
})
# Fetch values
puts bson["name"].as(BSON).to_json
# => {"first_name":"John","last_name":"Doe"}
puts bson["404"]?
# => nil
# Append another BSON
other_bson = BSON.new({ other: "field" })
bson.append(other_bson)
puts bson["other"]
# => field
```
### Iterate
```crystal
bson = BSON.new({
one: 1,
two: 2.0,
three: 3
})
# Enumerator
bson.each { |(key, value)|
puts "#{key}, #{value}"
# => one, 1
# => two, 2.0
# => three, 3
}
# Iterator
puts bson.each.map { |(key, value)|
value.as(Number) + 1
}.to_a
# => [2, 3.0, 4]
```
### Conversions
```crystal
bson = BSON.new({
one: 1,
two: "2",
binary: Slice[0_u8, 1_u8, 2_u8]
})
pp bson.to_h
# => {"one" => 1, "two" => "2", "binary" => Bytes[0, 1, 2]}
pp bson.each.to_a
# => [{"one", 1, Int32, nil}, {"two", "2", String, nil}, {"binary", Bytes[0, 1, 2], Binary, Generic}]
```
### JSON
```crystal
# Initialize from data in Relaxed Extended Json format.
# See: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst
bson = BSON.new(%({
"_id": {
"$oid": "57e193d7a9cc81b4027498b5"
},
"Binary": {
"$binary": {
"base64": "o0w498Or7cijeBSpkquNtg==",
"subType": "03"
}
},
string: "String",
number: 10.1
}))
# Serialize to Relaxed Extended Json format…
puts bson.to_json
# => {"_id":{"$oid":"57e193d7a9cc81b4027498b5"},"Binary":{"$binary":{"base64":"o0w498Or7cijeBSpkquNtg==","subType":"03"}},"string":"String","number":10.1}
# …or Canonical Extended Json.
puts bson.to_canonical_extjson
# => {"_id":{"$oid":"57e193d7a9cc81b4027498b5"},"Binary":{"$binary":{"base64":"o0w498Or7cijeBSpkquNtg==","subType":"03"}},"string":"String","number":{"$numberDouble":"10.1"}}
```
## Serialization
```crystal
class Data
include BSON::Serializable
include JSON::Serializable
property field : String
property counter : Int32
property nested : Nested
class Nested
include BSON::Serializable
include JSON::Serializable
property array : Array(String | Int32)
end
end
data = Data.from_json(%({
"field": "value",
"counter": 0,
"nested": {
"array": [
"element",
1
]
}
}))
puts data.to_json
# => {"field":"value","counter":0,"nested":{"array":["element",1]}}
puts data.to_bson.data.hexstring
# => 52000000026669656c64000600000076616c75650010636f756e7465720000000000036e65737465640027000000046172726179001b00000002300008000000656c656d656e740010310001000000000000
puts Data.from_bson(data.to_bson).to_json
# => {"field":"value","counter":0,"nested":{"array":["element",1]}}
```
## Validating ObjectIds
You can validate that a provided string is a valid MongoDB ObjectId before instantiating it with `.new()` with:
```crystal
# => true
p BSON::ObjectId.validate("57e193d7a9cc81b4027498b5")
# => false
p BSON::ObjectId.validate("qwerty")
# => false
p BSON::ObjectId.validate("1234567890abcdefghijklmn")
```
## Decimal128
The `Decimal128` code has been hastily copied from the [`bson-ruby`](https://github.com/mongodb/bson-ruby/blob/master/lib/bson/decimal128.rb) library.
It works, but performance is low because it uses an intermediate String representation.
## Contributing
1. Fork it (<https://github.com/elbywan/bson/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## Contributors
- [elbywan](https://github.com/elbywan) - creator and maintainer
## Credit
- Icon made by [Vitaly Gorbachev](https://www.flaticon.com/authors/vitaly-gorbachev) from [www.flaticon.com](https://www.flaticon.com).
Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This release
- Version
0.3.6- Tagged
- Jul 26, 2024
- Commit
4d84803a6066- Crystal
>= 0.35.0, < 2.0.0- Indexed
- yes
Dependents
Repository
github.com/elbywan/bson.cr
Metadata
- Created
- Aug 12, 2026
- Updated
- Aug 12, 2026
- Synced
- Aug 12, 2026
- Versions
- 24