Skip to main content

aweXpect.Json Nuget

Expectations for the System.Text.Json namespace.

Object serializable

You can verify that an object is JSON serializable:

MyObject subject = new();

await Expect.That(subject).IsJsonSerializable();

This will try to serialize and deserialize the provided object and check that they are equivalent.

You can provide both JSON serialization and equivalency options:

MyObject subject = new();

await Expect.That(subject).IsJsonSerializable(
new JsonSerializerOptions
{
IncludeFields = includeFields,
},
o => o.IgnoringMember("MyPropertyToIgnore"));

String comparison as JSON

You can compare two strings for JSON equivalency:

string subject = "{\"foo\":{\"bar\":[1,2,3]}}";
string expected = """
{
"foo": {
"bar": [ 1, 2, 3 ]
}
}
""";

await Expect.That(subject).Is(expected).AsJson();

Validation

You can verify, that a string is valid JSON.

string subject = "{\"foo\": 2}";

await Expect.That(subject).IsValidJson();

This verifies that the string can be parsed by JsonDocument.Parse without exceptions.

You can also specify the JsonDocumentOptions:

string subject = "{\"foo\": 2}";

await Expect.That(subject).IsValidJson(o => o with {CommentHandling = JsonCommentHandling.Disallow});

You can also add additional expectations on the JsonElement created when parsing the subject:

string subject = "{\"foo\": 2}";

await Expect.That(subject).IsValidJson().Which(j => j.Matches(new{foo = 2}));

You can also use a shorthand syntax for a match comparison:

string subject = "[{\"foo\": 2}, {\"foo\": 3}, {\"foo\": 4, \"bar\": 2}]";

await Expect.That(subject).IsValidJsonMatching([ new{ foo = 2 }, new{ foo = 3 }, new{ foo = 4 } ]);

JsonElement

Match

You can verify, that the JsonElement matches an expected object:

JsonElement subject = JsonDocument.Parse("{\"foo\": 1, \"bar\": \"baz\"}").RootElement;

await Expect.That(subject).Matches(new{foo = 1});
await Expect.That(subject).MatchesExactly(new{foo = 1, bar = "baz"});

You can verify, that the JsonElement matches an expected array:

JsonElement subject = JsonDocument.Parse("[1,2,3]").RootElement;

await Expect.That(subject).Matches([1, 2]);
await Expect.That(subject).MatchesExactly([1, 2, 3]);

You can also verify, that the JsonElement matches a primitive type:

await Expect.That(JsonDocument.Parse("\"foo\"").RootElement).Matches("foo");
await Expect.That(JsonDocument.Parse("42.3").RootElement).Matches(42.3);
await Expect.That(JsonDocument.Parse("true").RootElement).Matches(true);
await Expect.That(JsonDocument.Parse("null").RootElement).Matches(null);

Be object

You can verify that a JsonElement is a JSON object that satisfy some expectations:

JsonElement subject = JsonDocument.Parse("{\"foo\": 1, \"bar\": \"baz\"}").RootElement;

await Expect.That(subject).IsObject(o => o
.With("foo").Matching(1).And
.With("bar").Matching("baz"));

You can also verify that a property is another object recursively:

JsonElement subject = JsonDocument.Parse("{\"foo\": {\"bar\": \"baz\"}}").RootElement;

await Expect.That(subject).IsObject(o => o
.With("foo").AnObject(i => i
.With("bar").Matching("baz")));

You can also verify that a property is an array:

JsonElement subject = JsonDocument.Parse("{\"foo\": [1, 2]}").RootElement;

await Expect.That(subject).IsObject(o => o
.With("foo").AnArray(a => a.WithElements(1, 2)));

You can also verify the number of properties in a JSON object:

JsonElement subject = JsonDocument.Parse("{\"foo\": 1, \"bar\": \"baz\"}").RootElement;

await Expect.That(subject).IsObject(o => o.With(2).Properties());

Be array

You can verify that a JsonElement is a JSON array that satisfy some expectations:

JsonElement subject = JsonDocument.Parse("[\"foo\",\"bar\"]").RootElement;

await Expect.That(subject).IsArray(a => a
.At(0).Matching("foo").And
.At(1).Matching("bar"));

You can also verify the number of elements in a JSON array:

JsonElement subject = JsonDocument.Parse("[1, 2, 3]").RootElement;

await Expect.That(subject).IsArray(o => o.With(3).Elements());

You can also directly match the expected values of an array:

JsonElement subject = JsonDocument.Parse("[\"foo\",\"bar\"]").RootElement;

await Expect.That(subject).IsArray(a => a
.WithElements("foo", "bar"));

You can also match sub-arrays recursively (add null to skip an element):

JsonElement subject = JsonDocument.Parse("[[0,1,2],[1,2,3],[2,3,4],[3,4,5,6]]").RootElement;

await Expect.That(subject).IsArray(a => a
.WithArrays(
i => i.WithElements(0,1,2),
i => i.At(0).Matching(1).And.At(2).Matching(3),
null,
i => i.With(4).Elements()
));

You can also match objects recursively (add null to skip an element):

JsonElement subject = JsonDocument.Parse(
"""
[
{"foo":1},
{"bar":2},
{"bar": null, "baz": true}
]
""").RootElement;
await Expect.That(subject).IsArray(a => a
.WithObjects(
i => i.With("foo").Matching(1),
null,
i => i.With(2).Properties()
));

JSON serializable

You can verify that an object is JSON serializable:

MyClass subject = new MyClass();

await Expect.That(subject).IsJsonSerializable();

This validates, that the MyClass can be serialized and deserialized to/from JSON and that the result is equivalent to the original subject.

You can specify both, the JsonSerializerOptions and the equivalency options:

MyClass subject = new MyClass();

await Expect.That(subject).IsJsonSerializable(
new JsonSerializerOptions { IncludeFields = true },
e => e.IgnoringMember("Foo"));

You can also specify an expected generic type that the subject should have:

object subject = //...

await Expect.That(subject).IsJsonSerializable<MyClass>(
new JsonSerializerOptions { IncludeFields = true },
e => e.IgnoringMember("Foo"));