JavaScriptSerializer::Deserialize() 删除超链接
JavaScriptSerializer::Deserialize() removes hyperlinks
我有一个 AutoMapper 映射,看起来像这样
AutoMapper.Mapper.CreateMap<Dictionary<string, string>, DailyCheck>().ConvertUsing(
x =>
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize<DailyCheck>(
Regex.Replace(serializer.Serialize(x),
"\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b",
"${day}-${month}-${year}", RegexOptions.None,
TimeSpan.FromMilliseconds(150))
);
}
);
代码的作用是使用字典并使用 JavaScriptSerializer 创建一个 Json 对象,然后我将该对象传递给 Deserialize() 函数以将其映射到 DailyCheck 类型的强类型对象。
我遇到的问题是,当 Deserealizing 一个 http link 被删除并且 属性 被设置为空时。
除了明显的问题:"How do I fix this" 我还想问为什么盒子标准函数 JavaScriptSerializer.Serialize() 没有正确转义 link 所以它可以反序列化 ()正确。
这是DailyCheck的内容class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Core.BusinessLayer
{
/// <summary>
/// Business Layer Interface of Daily Checks
/// </summary>
public class DailyCheck
{
/// <summary>
/// Identifier of check
/// </summary>
public string Id { get; set; }
/// <summary>
/// The name of the check
/// </summary>
public string Name { get; set; }
/// <summary>
/// Type of check, e.g. Stored procedure
/// </summary>
public string Type { get; set; }
/// <summary>
/// How often the check should be run
/// </summary>
public string Frequency { get; set; }
/// <summary>
/// What category does this check relate to?
/// </summary>
public string Category { get; set; }
/// <summary>
/// The working instruction associated with the check
/// </summary>
public string WorkingInstruction { get; set; }
/// <summary>
/// Check description
/// </summary>
public string Description { get; set; }
/// <summary>
/// Current status of check, E.g. Running/Failed/Succeeded
/// </summary>
public string Status { get; set; }
/// <summary>
/// The start date of the check, when it was made
/// </summary>
public DateTime StartDate { get; set; }
/// <summary>
/// The ending date for the check, only not nulled if it is completed
/// </summary>
public DateTime? EndDate { get; set; }
/// <summary>
/// Transi of last user to edit the check
/// </summary>
public string Transi { get; set; }
/// <summary>
/// Full name of the last user to edit check
/// </summary>
public string UserName { get; set; }
/// <summary>
/// Last comment left for check
/// </summary>
public string Comment { get; set; }
/// <summary>
/// Iid of user to last sign off check
/// </summary>
public string SignedOffBy { get; set; }
/// <summary>
/// Id of latest run
/// </summary>
public string RunId { get; set; }
/// <summary>
/// Id of latest result
/// </summary>
public string ResultId { get; set; }
/// <summary>
/// Command associated with check
/// </summary>
public string Command { get; set; }
}
}
编辑:您可以使用以下 Json 对象来测试
{"id":"1","name":"TEST","type":"SP","frequency":"TD","category":"INT","working_instruction":"http://www.google.co.uk","description":"","command":"UPDATE","status":"NC","startdate":"","enddate":"","transi":"0000","runid":"","comment":"","signedoffby":"","resultid":"","username":""}
手表中显示的原始值 window 如下所示:
"{\"id\":\"335\",\"name\":\"TEST\",\"type\":\"SP\",\"frequency\":\"TD\",\"category\":\"INT\",\"working_instruction\":\"http://www.google.co.uk\",\"description\":\"\",\"command\":\"UPDATE\",\"status\":\"NC\",\"startdate\":\"\",\"enddate\":\"\",\"transi\":\"051w\",\"runid\":\"\",\"comment\":\"\",\"signedoffby\":\"\",\"resultid\":\"\",\"username\":\"\"}"
JavaScriptSerializer 尽最大努力将 属性 名称与 JSON 字段匹配,但是不会从名为 working_instruction
的字段中填充名为 WorkingInstruction
的 属性 ] 因为下划线。
要么将 属性 重命名为 Working_Instruction
,要么用 [DataContract]
和 [DataMember(Name = "working_instruction)]"
属性注释整个 class。
我有一个 AutoMapper 映射,看起来像这样
AutoMapper.Mapper.CreateMap<Dictionary<string, string>, DailyCheck>().ConvertUsing(
x =>
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize<DailyCheck>(
Regex.Replace(serializer.Serialize(x),
"\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b",
"${day}-${month}-${year}", RegexOptions.None,
TimeSpan.FromMilliseconds(150))
);
}
);
代码的作用是使用字典并使用 JavaScriptSerializer 创建一个 Json 对象,然后我将该对象传递给 Deserialize() 函数以将其映射到 DailyCheck 类型的强类型对象。
我遇到的问题是,当 Deserealizing 一个 http link 被删除并且 属性 被设置为空时。
除了明显的问题:"How do I fix this" 我还想问为什么盒子标准函数 JavaScriptSerializer.Serialize() 没有正确转义 link 所以它可以反序列化 ()正确。
这是DailyCheck的内容class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Core.BusinessLayer
{
/// <summary>
/// Business Layer Interface of Daily Checks
/// </summary>
public class DailyCheck
{
/// <summary>
/// Identifier of check
/// </summary>
public string Id { get; set; }
/// <summary>
/// The name of the check
/// </summary>
public string Name { get; set; }
/// <summary>
/// Type of check, e.g. Stored procedure
/// </summary>
public string Type { get; set; }
/// <summary>
/// How often the check should be run
/// </summary>
public string Frequency { get; set; }
/// <summary>
/// What category does this check relate to?
/// </summary>
public string Category { get; set; }
/// <summary>
/// The working instruction associated with the check
/// </summary>
public string WorkingInstruction { get; set; }
/// <summary>
/// Check description
/// </summary>
public string Description { get; set; }
/// <summary>
/// Current status of check, E.g. Running/Failed/Succeeded
/// </summary>
public string Status { get; set; }
/// <summary>
/// The start date of the check, when it was made
/// </summary>
public DateTime StartDate { get; set; }
/// <summary>
/// The ending date for the check, only not nulled if it is completed
/// </summary>
public DateTime? EndDate { get; set; }
/// <summary>
/// Transi of last user to edit the check
/// </summary>
public string Transi { get; set; }
/// <summary>
/// Full name of the last user to edit check
/// </summary>
public string UserName { get; set; }
/// <summary>
/// Last comment left for check
/// </summary>
public string Comment { get; set; }
/// <summary>
/// Iid of user to last sign off check
/// </summary>
public string SignedOffBy { get; set; }
/// <summary>
/// Id of latest run
/// </summary>
public string RunId { get; set; }
/// <summary>
/// Id of latest result
/// </summary>
public string ResultId { get; set; }
/// <summary>
/// Command associated with check
/// </summary>
public string Command { get; set; }
}
}
编辑:您可以使用以下 Json 对象来测试
{"id":"1","name":"TEST","type":"SP","frequency":"TD","category":"INT","working_instruction":"http://www.google.co.uk","description":"","command":"UPDATE","status":"NC","startdate":"","enddate":"","transi":"0000","runid":"","comment":"","signedoffby":"","resultid":"","username":""}
手表中显示的原始值 window 如下所示:
"{\"id\":\"335\",\"name\":\"TEST\",\"type\":\"SP\",\"frequency\":\"TD\",\"category\":\"INT\",\"working_instruction\":\"http://www.google.co.uk\",\"description\":\"\",\"command\":\"UPDATE\",\"status\":\"NC\",\"startdate\":\"\",\"enddate\":\"\",\"transi\":\"051w\",\"runid\":\"\",\"comment\":\"\",\"signedoffby\":\"\",\"resultid\":\"\",\"username\":\"\"}"
JavaScriptSerializer 尽最大努力将 属性 名称与 JSON 字段匹配,但是不会从名为 working_instruction
的字段中填充名为 WorkingInstruction
的 属性 ] 因为下划线。
要么将 属性 重命名为 Working_Instruction
,要么用 [DataContract]
和 [DataMember(Name = "working_instruction)]"
属性注释整个 class。