【问题标题】:JavaScriptSerializer::Deserialize() removes hyperlinksJavaScriptSerializer::Deserialize() 删除超链接
【发布时间】:2017-06-23 14:17:56
【问题描述】:

我有一个像这样的 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))
                    );
            }
            );

代码的作用是获取一个 Dictionary 并使用 JavaScriptSerializer 创建一个 Json 对象,然后将该对象传递给 Deserialize() 函数以将其映射到 DailyCheck 类型的强类型对象。

我遇到的问题是,当 Deserealizing 一个 http 链接被删除并且该属性设置为空时。

除了显而易见的问题:“我该如何解决这个问题”,我还想问一下为什么盒子标准函数 JavaScriptSerializer.Serialize() 不能正确地转义链接,所以它可以正确地 Deserialized()。

这是 DailyCheck 类的内容

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":""}

观察窗口中显示的原始值如下所示:

"{\"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\":\"\"}"

【问题讨论】:

  • 您能否通过共享输入 Dictionary&lt;string, string&gt; 来将您的问题扩展到 minimal reproducible example 以重现问题?
  • 抱歉,我现在将输入样本并更新我的问题。
  • @dbc 我已经更新了我的问题,如果您需要其他任何内容,请告诉我,感谢您的帮助,谢谢。
  • WorkingInstruction != working_instruction.
  • @CodeCaster AUHDGAWIYFGYAGFYAGFAYWGFAYWFGAWYGFYAWGFYAWGFYAWGFYAWGFYAWGFYAWGFAWGFYAWGFYAGWFGAWFGAWYFGAWGFYAWGFYAWGFUYAWGFYAWGFWAGFAWGFYAWGFAWGF 谢谢老兄,修好了

标签: c# json serialization automapper javascriptserializer


【解决方案1】:

JavaScriptSerializer 尽最大努力将属性名称与 JSON 字段匹配,但由于存在下划线,因此不会从名为 working_instruction 的字段中填充名为 WorkingInstruction 的属性。

要么将属性重命名为Working_Instruction,要么使用[DataContract][DataMember(Name = "working_instruction)]" 属性注释整个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多