Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void UsingExpandoObject()
[Benchmark]
public void NewtonsoftJsonAnonymousType()
{
NewtonsoftJson.UsingAnonymousTypeWithDictionary(_json);
NewtonsoftJson.UsingAnonymousType(_json);
}

[BenchmarkCategory(nameof(NewtonsoftJson))]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
<PropertyGroup>
Expand All @@ -13,10 +13,8 @@
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
<PackageReference Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.13.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="System.Text.Json" Version="6.0.2" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\JsonDeserializationDynamicObject\JsonDeserializationDynamicObject.csproj" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="System.Text.Json" Version="6.0.2" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="4.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.0">
<PackageReference Include="coverlet.collector" Version="10.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using JsonDeserializationDynamicObject.Native;
using Xunit;
using System.Text.Json;
using System;
using Microsoft.CSharp.RuntimeBinder;

namespace JsonDeserializationDynamicObject.Tests;

Expand All @@ -14,7 +14,7 @@ public void GivenJsonString_WhenUsingDynamic_ThenDeserializeAsJsonElement()

var dynamicObject = JsonSerializer.Deserialize<dynamic>(jsonString)!;

Assert.ThrowsAny<Exception>(() => dynamicObject.Genre);
Assert.Throws<RuntimeBinderException>(() => dynamicObject.Genre);
Assert.IsType<JsonElement>(dynamicObject);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
using System.Text.Json;
using JsonSerializer = System.Text.Json.JsonSerializer;
using Microsoft.CSharp.RuntimeBinder;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Xunit;

namespace JsonDeserializationDynamicObject.Tests;

public class ReturnTypeTests
{
private const string JsonObjectPayload = @"{ ""Genre"": ""Thriller"" }";
private const string JsonArrayPayload = "[ 1, 2, 3 ]";
private const string JsonStringPayload = @"""Thriller""";
private const string JsonNumberPayload = "8.1";
private const string JsonBooleanPayload = "true";
private const string JsonNullPayload = "null";

[Fact]
public void GivenJsonObject_WhenDeserializingToDynamic_ThenWeGetJObject()
{
object result = JsonConvert.DeserializeObject<dynamic>(JsonObjectPayload)!;

Assert.IsType<JObject>(result);
}

[Fact]
public void GivenJsonArray_WhenDeserializingToDynamic_ThenWeGetJArray()
{
object result = JsonConvert.DeserializeObject<dynamic>(JsonArrayPayload)!;

Assert.IsType<JArray>(result);
}

[Fact]
public void GivenJsonString_WhenDeserializingToDynamic_ThenWeGetString()
{
object result = JsonConvert.DeserializeObject<dynamic>(JsonStringPayload)!;

Assert.IsType<string>(result);
Assert.Equal("Thriller", result);
}

[Fact]
public void GivenJsonNumber_WhenDeserializingToDynamic_ThenWeGetDouble()
{
object result = JsonConvert.DeserializeObject<dynamic>(JsonNumberPayload)!;

Assert.IsType<double>(result);
Assert.Equal(8.1d, result);
}

[Fact]
public void GivenJsonBoolean_WhenDeserializingToDynamic_ThenWeGetBool()
{
object result = JsonConvert.DeserializeObject<dynamic>(JsonBooleanPayload)!;

Assert.IsType<bool>(result);
Assert.Equal(true, result);
}

[Fact]
public void GivenJsonNull_WhenDeserializingToDynamic_ThenWeGetNullReference()
{
object? result = JsonConvert.DeserializeObject<dynamic>(JsonNullPayload);

Assert.Null(result);
}

[Theory]
[InlineData(JsonStringPayload, JTokenType.String)]
[InlineData(JsonNumberPayload, JTokenType.Float)]
[InlineData(JsonBooleanPayload, JTokenType.Boolean)]
[InlineData(JsonNullPayload, JTokenType.Null)]
public void GivenJsonScalar_WhenDeserializingToJToken_ThenWeGetJValueOfExpectedType(string payload, JTokenType expected)
{
var result = JsonConvert.DeserializeObject<JToken>(payload)!;

var value = Assert.IsType<JValue>(result);
Assert.Equal(expected, value.Type);
}

[Fact]
public void GivenJsonObject_WhenDeserializingToJToken_ThenWeGetJObject()
{
var result = JsonConvert.DeserializeObject<JToken>(JsonObjectPayload)!;

Assert.IsType<JObject>(result);
}

[Fact]
public void GivenJsonArray_WhenDeserializingToJToken_ThenWeGetJArray()
{
var result = JsonConvert.DeserializeObject<JToken>(JsonArrayPayload)!;

Assert.IsType<JArray>(result);
}

[Theory]
[InlineData(JsonObjectPayload, JsonValueKind.Object)]
[InlineData(JsonArrayPayload, JsonValueKind.Array)]
[InlineData(JsonStringPayload, JsonValueKind.String)]
[InlineData(JsonNumberPayload, JsonValueKind.Number)]
[InlineData(JsonBooleanPayload, JsonValueKind.True)]
public void GivenJsonPayload_WhenDeserializingToDynamicWithSystemTextJson_ThenWeGetJsonElementOfExpectedKind(string payload, JsonValueKind expected)
{
object result = JsonSerializer.Deserialize<dynamic>(payload)!;

var element = Assert.IsType<JsonElement>(result);
Assert.Equal(expected, element.ValueKind);
}

[Fact]
public void GivenJsonNull_WhenDeserializingToDynamicWithSystemTextJson_ThenWeGetNullReference()
{
object? result = JsonSerializer.Deserialize<dynamic>(JsonNullPayload);

Assert.Null(result);
}

[Fact]
public void GivenJsonElement_WhenAccessingMemberByName_ThenRuntimeBinderExceptionIsThrown()
{
dynamic result = JsonSerializer.Deserialize<dynamic>(JsonObjectPayload)!;

Assert.Throws<RuntimeBinderException>(() => result.Genre);
}

[Fact]
public void GivenJObject_WhenAccessingMemberByName_ThenValueIsResolvedAtRuntime()
{
dynamic result = JsonConvert.DeserializeObject<dynamic>(JsonObjectPayload)!;

Assert.Equal("Thriller", (string)result.Genre);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="System.Text.Json" Version="6.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>

</Project>
Loading