Browse Source

Add `AbpIgnorePropertiesModifiers`.

pull/13357/head
maliming 4 years ago
parent
commit
291c07155d
  1. 2
      framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs
  2. 26
      framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs
  3. 13
      framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs
  4. 15
      framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs
  5. 73
      framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIgnorePropertiesModifiers_Tests.cs
  6. 61
      framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIncludeNonPublicPropertiesModifiers_Tests.cs
  7. 2
      framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObject_Tests.cs

2
framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs

@ -14,7 +14,7 @@ public class AbpSystemTextJsonSerializerModifiersOptions
{
Modifiers = new List<Action<JsonTypeInfo>>
{
IncludeExtraPropertiesModifiers.Modify,
AbpIncludeExtraPropertiesModifiers.Modify,
};
}
}

26
framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text.Json.Serialization.Metadata;
namespace Volo.Abp.Json.SystemTextJson.Modifiers;
public class AbpIgnorePropertiesModifiers<TClass, TProperty>
where TClass : class
{
private Expression<Func<TClass, TProperty>> _propertySelector;
public Action<JsonTypeInfo> CreateModifyAction(Expression<Func<TClass, TProperty>> propertySelector)
{
_propertySelector = propertySelector;
return Modify;
}
public void Modify(JsonTypeInfo jsonTypeInfo)
{
if (jsonTypeInfo.Type == typeof(TClass))
{
jsonTypeInfo.Properties.RemoveAll(x => x.Name == _propertySelector.Body.As<MemberExpression>().Member.Name);
}
}
}

13
framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs → framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs

@ -1,19 +1,22 @@
using System;
using System.Linq;
using System.Reflection;
using System.Text.Json.Serialization.Metadata;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.Json.SystemTextJson.Modifiers;
public static class IncludeExtraPropertiesModifiers
public static class AbpIncludeExtraPropertiesModifiers
{
public static void Modify(JsonTypeInfo jsonTypeInfo)
{
var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x =>
x.PropertyType == typeof(ExtraPropertyDictionary) &&
x.Name.Equals(nameof(ExtensibleObject.ExtraProperties), StringComparison.OrdinalIgnoreCase) &&
x.Set == null);
var propertyJsonInfo = jsonTypeInfo.Properties
.Where(x => x.AttributeProvider != null && x.AttributeProvider is MemberInfo)
.FirstOrDefault(x =>
x.PropertyType == typeof(ExtraPropertyDictionary) &&
x.AttributeProvider.As<MemberInfo>().Name == nameof(ExtensibleObject.ExtraProperties) &&
x.Set == null);
if (propertyJsonInfo != null)
{

15
framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs → framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs

@ -1,17 +1,19 @@
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text.Json.Serialization.Metadata;
namespace Volo.Abp.Json.SystemTextJson.Modifiers;
public class IncludeNonPublicPropertiesModifiers<TClass, TProperty>
public class AbpIncludeNonPublicPropertiesModifiers<TClass, TProperty>
where TClass : class
{
private string _propertyName;
private Expression<Func<TClass, TProperty>> _propertySelector;
public Action<JsonTypeInfo> CreateModifyAction(string propertyName)
public Action<JsonTypeInfo> CreateModifyAction(Expression<Func<TClass, TProperty>> propertySelector)
{
_propertyName = propertyName;
_propertySelector = propertySelector;
return Modify;
}
@ -19,10 +21,11 @@ public class IncludeNonPublicPropertiesModifiers<TClass, TProperty>
{
if (jsonTypeInfo.Type == typeof(TClass))
{
var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.Name.Equals(_propertyName, StringComparison.OrdinalIgnoreCase) && x.Set == null);
var propertyName = _propertySelector.Body.As<MemberExpression>().Member.Name;
var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.Name == propertyName && x.Set == null);
if (propertyJsonInfo != null)
{
var propertyInfo = typeof(TClass).GetProperty(_propertyName);
var propertyInfo = typeof(TClass).GetProperty(propertyName, BindingFlags.NonPublic);
if (propertyInfo != null)
{
var jsonPropertyInfo = jsonTypeInfo.CreateJsonPropertyInfo(typeof(TProperty), propertyJsonInfo.Name);

73
framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIgnorePropertiesModifiers_Tests.cs

@ -0,0 +1,73 @@
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Json.SystemTextJson.Modifiers;
using Xunit;
namespace Volo.Abp.Json;
public class AbpIgnorePropertiesModifiers_Tests : AbpJsonTestBase
{
private readonly IJsonSerializer _jsonSerializer;
public AbpIgnorePropertiesModifiers_Tests()
{
_jsonSerializer = GetRequiredService<IJsonSerializer>();
}
protected override void AfterAddApplication(IServiceCollection services)
{
services.Configure<AbpSystemTextJsonSerializerModifiersOptions>(options =>
{
options.Modifiers.Add(new AbpIgnorePropertiesModifiers<FooDto, List<BarDto>>().CreateModifyAction(x => x.BarDtos));
options.Modifiers.Add(new AbpIgnorePropertiesModifiers<BarDto, string>().CreateModifyAction(x => x.Id));
});
base.AfterAddApplication(services);
}
[Fact]
public void Test()
{
var json = _jsonSerializer.Serialize(new FooDto()
{
Name = "foo",
BarDtos = new List<BarDto>
{
new BarDto
{
Name = "bar1"
},
new BarDto
{
Name = "bar2"
}
}
});
json.ShouldNotContain("bar");
json = _jsonSerializer.Serialize(new BarDto()
{
Id = "id",
Name = "bar"
});
json.ShouldNotContain("id");
}
class FooDto
{
public string Name { get; set; }
public List<BarDto> BarDtos { get; set; }
}
class BarDto
{
public string Id { get; set; }
public string Name { get; set; }
}
}

61
framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIncludeNonPublicPropertiesModifiers_Tests.cs

@ -0,0 +1,61 @@
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Json.SystemTextJson.Modifiers;
using Xunit;
namespace Volo.Abp.Json;
public class AbpIncludeNonPublicPropertiesModifiers_Tests : AbpJsonTestBase
{
private readonly IJsonSerializer _jsonSerializer;
public AbpIncludeNonPublicPropertiesModifiers_Tests()
{
_jsonSerializer = GetRequiredService<IJsonSerializer>();
}
protected override void AfterAddApplication(IServiceCollection services)
{
services.Configure<AbpSystemTextJsonSerializerModifiersOptions>(options =>
{
options.Modifiers.Add(new AbpIncludeNonPublicPropertiesModifiers<NonPublicPropertiesClass, string>().CreateModifyAction(x => x.Name));
options.Modifiers.Add(new AbpIncludeNonPublicPropertiesModifiers<NonPublicPropertiesClass, string>().CreateModifyAction(x => x.Age));
});
base.AfterAddApplication(services);
}
[Fact]
public void Test()
{
var json = _jsonSerializer.Serialize(new NonPublicPropertiesClass()
{
Id = "id"
});
json.ShouldContain("id");
json.ShouldContain("name");
json.ShouldContain("age");
var obj = _jsonSerializer.Deserialize<NonPublicPropertiesClass>(json);
obj.Id.ShouldBe("id");
obj.Name.ShouldBe("name");
obj.Age.ShouldBe("age");
}
class NonPublicPropertiesClass
{
public string Id { get; set; }
public string Name { get; private set; }
public string Age { get; protected set; }
public NonPublicPropertiesClass()
{
Name = "name";
Age = "age";
}
}
}

2
framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObject_Tests.cs

@ -7,7 +7,7 @@ using Xunit;
namespace Volo.Abp.Json;
public class ExtensibleObject_Tests: AbpJsonTestBase
public class ExtensibleObject_Tests : AbpJsonTestBase
{
private readonly IJsonSerializer _jsonSerializer;

Loading…
Cancel
Save