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 @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,14 @@ namespace CamelCaseSerialization;

public static class JsonSerializerExtensions
{
public static string SerializeWithCamelCase<T>(this T data)
private static readonly JsonSerializerOptions CamelCaseOptions = new()
{
return JsonSerializer.Serialize(data, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
}
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};

public static T DeserializeFromCamelCase<T>(this string json)
{
return JsonSerializer.Deserialize<T>(json, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
}
public static string SerializeWithCamelCase<T>(this T data) =>
JsonSerializer.Serialize(data, CamelCaseOptions);

public static T? DeserializeFromCamelCase<T>(this string json) =>
JsonSerializer.Deserialize<T>(json, CamelCaseOptions);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
// Deserialize
const string personString = """{"firstName":"John","surname":"Doe","age":20,"isActive":true}""";
var personFromString = JsonSerializer.Deserialize<PersonWithAttributes>(personString);
Console.WriteLine($"{personFromString.FirstName} {personFromString.Surname}({personFromString.IsActive}) is {personFromString.Age}");

Check warning on line 27 in json-csharp/CamelCaseSerialization/CamelCaseSerialization/Program.cs

View workflow job for this annotation

GitHub Actions / Build & test (json-csharp/CamelCaseSerialization)

Dereference of a possibly null reference.

Check warning on line 27 in json-csharp/CamelCaseSerialization/CamelCaseSerialization/Program.cs

View workflow job for this annotation

GitHub Actions / Build & test (json-csharp/CamelCaseSerialization)

Dereference of a possibly null reference.

// With JsonSerializerOptions param
Console.WriteLine($"{JsonSerializer.Serialize(person, new JsonSerializerOptions
Expand All @@ -32,8 +32,12 @@
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
})}");

// With the JsonSerializerDefaults.Web preset, the same options ASP.NET Core applies
var webOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web);
Console.WriteLine($"{JsonSerializer.Serialize(person, webOptions)}");

// With extension method
Console.WriteLine($"{person.SerializeWithCamelCase()}");

var personObject = personString.DeserializeFromCamelCase<Person>();
Console.WriteLine($"{personObject.FirstName} {personObject.Surname}({personObject.IsActive}) is {personObject.Age}");
Console.WriteLine($"{personObject?.FirstName} {personObject?.Surname}({personObject?.IsActive}) is {personObject?.Age}");
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">

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

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
<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.2">
<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,3 +1,5 @@
using System.Text.Json;

namespace CamelCaseSerialization.Tests;

public class ExtensionTests
Expand All @@ -15,7 +17,7 @@ public void GivenPerson_WhenUsingExtensionMethod_ThenSerializeWithCamelCase()

var result = person.SerializeWithCamelCase();

Assert.Equal(result, """{"firstName":"John","surname":"Doe","age":20,"isActive":true}""");
Assert.Equal("""{"firstName":"John","surname":"Doe","age":20,"isActive":true}""", result);
}

[Fact]
Expand All @@ -24,10 +26,28 @@ public void GivenJsonStringInCamelCase_WhenUsingExtensionMethod_ThenDeserializeI
var personJson = """{"firstName":"John","surname":"Doe","age":20,"isActive":true}""";

var result = personJson.DeserializeFromCamelCase<Person>();

Assert.Equal(result.Age, 20);
Assert.Equal(result.FirstName, "John");
Assert.Equal(result.Surname, "Doe");
Assert.Equal(result.IsActive, true);

Assert.NotNull(result);
Assert.Equal(20, result.Age);
Assert.Equal("John", result.FirstName);
Assert.Equal("Doe", result.Surname);
Assert.True(result.IsActive);
}

[Fact]
public void GivenPerson_WhenSerializingWithWebDefaults_ThenPropertyNamesAreCamelCase()
{
var person = new Person
{
Age = 20,
FirstName = "John",
Surname = "Doe",
IsActive = true
};
var webOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web);

var result = JsonSerializer.Serialize(person, webOptions);

Assert.Equal("""{"firstName":"John","surname":"Doe","age":20,"isActive":true}""", result);
}
}
Loading