Skip to content

Commit

Permalink
Merge pull request #9664 from abpframework/auto-merge/rel-4-4/495
Browse files Browse the repository at this point in the history
Merge branch dev with rel-4.4
  • Loading branch information
maliming committed Jul 27, 2021
2 parents 758f18a + e54699c commit e83ad43
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 3 deletions.
1 change: 1 addition & 0 deletions framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftPackageVersion)" />
<PackageReference Include="System.Text.Encodings.Web" Version="5.0.1" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.9" />
<PackageReference Include="System.Linq.Queryable" Version="4.3.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,18 @@ public class AbpHasExtraPropertiesJsonConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var newOptions = JsonSerializerOptionsHelper.Create(options, x =>
x == this ||
x.GetType() == typeof(AbpHasExtraPropertiesJsonConverterFactory));
var newOptions = JsonSerializerOptionsHelper.Create(options, x => x == this);

var converterFactory = newOptions.Converters.FirstOrDefault(x => x is AbpHasExtraPropertiesJsonConverterFactory).As<AbpHasExtraPropertiesJsonConverterFactory>();
var newConverterFactory = new AbpHasExtraPropertiesJsonConverterFactory();
if (converterFactory != null)
{
newOptions.Converters.Remove(converterFactory);
newConverterFactory.AddExcludeTypes(converterFactory.GetExcludeTypes().ToArray());
}

newConverterFactory.AddExcludeTypes(typeToConvert);
newOptions.Converters.Add(newConverterFactory);

var rootElement = JsonDocument.ParseValue(ref reader).RootElement;
if (rootElement.ValueKind == JsonValueKind.Object)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
Expand All @@ -11,8 +13,26 @@ public class AbpHasExtraPropertiesJsonConverterFactory : JsonConverterFactory
{
private static readonly ConcurrentDictionary<Type, bool> CachedTypes = new ConcurrentDictionary<Type, bool>();

private readonly List<Type> _excludeTypes = new List<Type>();

public virtual AbpHasExtraPropertiesJsonConverterFactory AddExcludeTypes(params Type[] excludeTypes)
{
_excludeTypes.AddIfNotContains(excludeTypes);
return this;
}

public virtual IReadOnlyList<Type> GetExcludeTypes()
{
return _excludeTypes.ToImmutableList();
}

public override bool CanConvert(Type typeToConvert)
{
if (_excludeTypes.Contains(typeToConvert))
{
return false;
}

//Only for private or protected ExtraProperties.
if (typeof(IHasExtraProperties).IsAssignableFrom(typeToConvert))
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
using System.Collections.Generic;
using System.Linq;
using Shouldly;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Xunit;

namespace Volo.Abp.Json
{
public class AbpHasExtraPropertiesJsonConverter_Tests: AbpJsonTestBase
{
private readonly IJsonSerializer _jsonSerializer;

public AbpHasExtraPropertiesJsonConverter_Tests()
{
_jsonSerializer = GetRequiredService<IJsonSerializer>();
}

[Fact]
public void JsonConverter_Test()
{
var fooDto = new FooDto
{
Name = "foo-dto",
BarDtos = new List<BarDto>()
};
fooDto.SetProperty("foo", "foo-value");

var barDto = new BarDto
{
Name = "bar-dto"
};
barDto.SetProperty("bar", "bar-value");
fooDto.BarDtos.Add(barDto);

var json = _jsonSerializer.Serialize(fooDto);

fooDto = _jsonSerializer.Deserialize<FooDto>(json);
fooDto.ShouldNotBeNull();
fooDto.Name.ShouldBe("foo-dto");
fooDto.GetProperty("foo").ShouldBe("foo-value");

fooDto.BarDtos.Count.ShouldBe(1);
fooDto.BarDtos.First().Name.ShouldBe("bar-dto");
fooDto.BarDtos.First().GetProperty("bar").ShouldBe("bar-value");

fooDto.Name = "new-foo-dto";
fooDto.SetProperty("foo", "new-foo-value");
fooDto.BarDtos.First().Name = "new-bar-dto";
fooDto.BarDtos.First().SetProperty("bar", "new-bar-value");

json = _jsonSerializer.Serialize(fooDto);

fooDto = _jsonSerializer.Deserialize<FooDto>(json);
fooDto.ShouldNotBeNull();
fooDto.Name.ShouldBe("new-foo-dto");
fooDto.GetProperty("foo").ShouldBe("new-foo-value");

fooDto.BarDtos.Count.ShouldBe(1);
fooDto.BarDtos.First().Name.ShouldBe("new-bar-dto");
fooDto.BarDtos.First().GetProperty("bar").ShouldBe("new-bar-value");
}
}

public class FooDto : ExtensibleObject
{
public string Name { get; set; }

public List<BarDto> BarDtos { get; set; }
}

public class BarDto : ExtensibleObject
{
public string Name { get; set; }
}
}

0 comments on commit e83ad43

Please sign in to comment.