Query for Raw JSON
Marten stores documents as JSON, and sometimes it might be valuable to access the raw JSON representation of the stored documents. To that end, the IQuerySession.Json
property gives you access to several helper methods to load JSON strings.
cs
[Fact]
public void when_find_then_a_json_should_be_returned()
{
var issue = new Issue { Title = "Issue 2" };
theSession.Store(issue);
theSession.SaveChanges();
var json = theSession.Json.FindById<Issue>(issue.Id);
json.ShouldBe($"{{\"Id\": \"{issue.Id}\", \"Tags\": null, \"BugId\": null, \"Title\": \"Issue 2\", \"Number\": 0, \"Status\": null, \"AssigneeId\": null, \"ReporterId\": null}}");
}
There is also an asynchronous version:
cs
[Fact]
public async Task when_find_then_a_json_should_be_returned()
{
var issue = new Issue { Title = "Issue 2" };
theSession.Store(issue);
await theSession.SaveChangesAsync();
var json = await theSession.Json.FindByIdAsync<Issue>(issue.Id);
json.ShouldBe($"{{\"Id\": \"{issue.Id}\", \"Tags\": null, \"BugId\": null, \"Title\": \"Issue 2\", \"Number\": 0, \"Status\": null, \"AssigneeId\": null, \"ReporterId\": null}}");
}
Marten supplies the following functionality to retrieve the raw JSON strings:
cs
[Fact]
public async Task when_get_json_then_raw_json_should_be_returned()
{
var issue = new Issue { Title = "Issue 1" };
theSession.Store(issue);
await theSession.SaveChangesAsync();
var json = await theSession.Query<Issue>().Where(x => x.Title == "Issue 1").ToJsonArray();
json.ShouldNotBeNull();
json = await theSession.Query<Issue>().ToJsonFirst();
json = await theSession.Query<Issue>().ToJsonFirstOrDefault();
json = await theSession.Query<Issue>().ToJsonSingle();
json = await theSession.Query<Issue>().ToJsonSingleOrDefault();
}
And the asynchronous version:
cs
[Fact]
public async Task when_get_json_then_raw_json_should_be_returned_async()
{
var issue = new Issue { Title = "Issue 1" };
theSession.Store(issue);
await theSession.SaveChangesAsync();
var json = await theSession.Query<Issue>().Where(x => x.Title == "Issue 1").ToJsonArray();
json.ShouldNotBeNull();
json = await theSession.Query<Issue>().ToJsonFirst();
json = await theSession.Query<Issue>().ToJsonFirstOrDefault();
json = await theSession.Query<Issue>().ToJsonSingle();
json = await theSession.Query<Issue>().ToJsonSingleOrDefault();
}
Using AsJson() with Select() Transforms
Marten has the ability to combine the AsJson()
mechanics to the result of a Select()
transform:
cs
var json = await theSession
.Query<User>()
.OrderBy(x => x.FirstName)
// Transform the User class to a different type
.Select(x => new UserName { Name = x.FirstName })
.ToJsonFirst();
json.ShouldBe("{\"Name\": \"Bill\"}");
And another example, but this time transforming to an anonymous type:
cs
(await theSession
.Query<User>()
.OrderBy(x => x.FirstName)
// Transform to an anonymous type
.Select(x => new {Name = x.FirstName})
// Select only the raw JSON
.ToJsonFirstOrDefault())
.ShouldBe("{\"Name\": \"Bill\"}");