The latest Amazon DynamoDB update added support for JSON data, making it easy to store JSON documents in a DynamoDB table while preserving their complex and possibly nested shape. Now, the AWS SDK for .NET has added native JSON support, so you can use raw JSON data when working with DynamoDB. This is especially helpful if your application needs to consume or produce JSON—for instance, if your application is talking to a client-side component that uses JSON to send and receive data—as you no longer need to manually parse or compose this data.
Using the new features
The new JSON functionality is exposed in the AWS SDK for .NET through the Document class:
ToJson- This method converts a given Document to its JSON representation
FromJson- This method creates a Document for a given JSON string
Here's a quick example of this feature in action.
// Create a Document from JSON data var jsonDoc = Document.FromJson(json); // Use the Document as an attribute var doc = new Document(); doc["Id"] = 123; doc["NestedDocument"] = jsonDoc; // Put the item table.PutItem(doc); // Load the item doc = table.GetItem(42); // Convert the Document to JSON var jsonText = doc.ToJson(); var jsonPrettyText = doc["NestedDocument"].AsDocument().ToJsonPretty();
This example shows how a JSON-based Document can be used as an attribute, but you can also use the converted Document directly, provided that it has the necessary key attributes.
Also note that we have introduced the methods
ToJsonPretty. The difference between the two is that the latter will produce indented JSON that is easier to read.
DynamoDB data types are a superset of JSON data types. This means that all JSON data can be represented as DynamoDB data, while the opposite isn't true.
So if you perform the conversion JSON -> Document -> JSON, the starting and final JSON will be identical (except for formatting). However, since not all DynamoDB data types can be converted to JSON, the conversion Document -> JSON -> Document may result in a different representation of your data.
The differences between DynamoDB and JSON are:
- JSON has no sets, just arrays, so DynamoDB sets (SS, NS, and BS types) will be converted to JSON arrays.
- JSON has no binary representation, so DynamoDB binary scalars and sets (B and BS types) will be converted to base64-encoded JSON strings or lists of strings.
If you do end up with a Document instance that has base64-encoded data, we have provided a method on the Document object to decode this data and replace it with the correct binary representation. Here is a simple example:
After executing the above code, the "Data" attribute will contain binary data, while the "DataSet" attribute will contain a list of binary data.
I hope you find this feature a useful addition to the AWS SDK for .NET. Please give it a try and let us know what you think on GitHub or here in the comments!