html字符转义序列,反序列化期间有选择地转义字符串中的HTML

小编典典

在自定义中JsonConverter,可以通过Path从中选择属性来找到要反序列化的JSON属性的名称JsonReader。

string propertyName = reader.Path.Split('.').Last();

但是,这不能解决您的整体问题。假设JSON属性的名称与您的目标类属性匹配,那么您仍然需要一种获取父对象类型的方法,以便从中获取自定义属性。不幸的是,此信息在转换器内部不可用。转换器仅负责它说可以转换的对象类型(在您的情况下为字符串)以及该对象的子属性(在这种情况下,因为字符串是基元,所以不负责)。因此,要使其正常工作,需要编写转换器以在

父级上运行

类,然后需要处理该类的所有字符串属性。由于您的目标似乎是将HTML编码行为应用于所有类中的所有字符串,因此您将需要一个通用转换器来处理所有非原始类型,这可能会变得非常混乱,具体取决于您尝试的内容反序列化。

幸运的是,有更好的方法。除了使用之外JsonConverter,您还可以IContractResolver结合使用自定义项和IValueProvider来解决此问题。A

ContractResolver更适合于您想广泛应用某种行为的此类问题。

下面是您需要的代码示例。的CustomResolver类扩展DefaultContractResolver由Json.Net提供。该CreateProperties()方法检查JsonProperty由基础解析器创建的对象,并将内部HtmlEncodingValueProvider类的实例附加到未[AllowHtml]应用属性的任何字符串属性。每个值提供者随后都通过SetValue()方法处理其目标字符串属性的实际编码。

public class CustomResolver : DefaultContractResolver

{

protected override IList CreateProperties(Type type, MemberSerialization memberSerialization)

{

IList props = base.CreateProperties(type, memberSerialization);

// Find all string properties that do not have an [AllowHtml] attribute applied

// and attach an HtmlEncodingValueProvider instance to them

foreach (JsonProperty prop in props.Where(p => p.PropertyType == typeof(string)))

{

PropertyInfo pi = type.GetProperty(prop.UnderlyingName);

if (pi != null && pi.GetCustomAttribute(typeof(AllowHtmlAttribute), true) == null)

{

prop.ValueProvider = new HtmlEncodingValueProvider(pi);

}

}

return props;

}

protected class HtmlEncodingValueProvider : IValueProvider

{

PropertyInfo targetProperty;

public HtmlEncodingValueProvider(PropertyInfo targetProperty)

{

this.targetProperty = targetProperty;

}

// SetValue gets called by Json.Net during deserialization.

// The value parameter has the original value read from the JSON;

// target is the object on which to set the value.

public void SetValue(object target, object value)

{

var encoded = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode((string)value, useNamedEntities: true);

targetProperty.SetValue(target, encoded);

}

// GetValue is called by Json.Net during serialization.

// The target parameter has the object from which to read the string;

// the return value is the string that gets written to the JSON

public object GetValue(object target)

{

// if you need special handling for serialization, add it here

return targetProperty.GetValue(target);

}

}

}

要使用解析器,请创建一个新JsonSerializerSettings实例,然后将其ContractResolver属性设置为自定义解析器的新实例,并将设置传递给该JsonConvert.DeserializeObject()方法。

这是一个简短的演示:

class Program

{

static void Main(string[] args)

{

string json = @"

{

""Name"" : ""Foo Bar"",

""Description"" : ""

Bada Boom Bada Bing

"",

}";

JsonSerializerSettings settings = new JsonSerializerSettings

{

ContractResolver = new CustomResolver()

};

Foo foo = JsonConvert.DeserializeObject(json, settings);

Console.WriteLine("Name: " + foo.Name);

Console.WriteLine("Desc: " + foo.Description);

}

}

class Foo

{

public string Name { get; set; }

[AllowHtml]

public string Description { get; set; }

}

class AllowHtmlAttribute : Attribute { }

这是输出。请注意,该Name属性获取HTML编码,而该Description属性未获取HTML编码。

Name: <b>Foo Bar</b>

Desc:

Bada Boom Bada Bing

2020-07-27

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值