JSON 序列化混淆

本文关键字:序列化 JSON | 更新日期: 2023-09-27 18:36:35

我只是在构建一个测试 Web API,它接受 JSON 有效负载,并且只需从我的 MVC 控制器发回数组部分中的数据。

这是我被填充的类序列化时的当前 JSON 字符串:

{"JobList":[{"ID":1,"Name":"Dave","Age":23,"StartDate":"10/23/2013 6:22:50 AM","JobTitle":"Developer"},{"ID":2,"Name":"John","Age":44,"StartDate":"10/23/2013 6:22:50 AM","JobTitle":"QA"},{"ID":3,"Name":"Dave","Age":23,"StartDate":"10/23/2013 6:22:50 AM","JobTitle":"Senior Developer"}]}

这是用于创建此 JSON 的对象:

var jobList = new JobsList()
        {
            JobList = new List<Jobs>()
            {
                new Jobs()
                {
                    Age = 23,
                    ID = 1,
                    Name = "Dave",
                    StartDate = DateTime.Now.ToString(),
                    JobTitle = "Developer"
                },
                new Jobs()
                {
                    Age = 44,
                    ID = 2,
                    Name = "John",
                    StartDate = DateTime.Now.ToString(),
                    JobTitle = "QA"
                },
                new Jobs()
                {
                    Age = 23,
                    ID = 3,
                    Name = "Dave",
                    StartDate = DateTime.Now.ToString(),
                    JobTitle = "Senior Developer"
                }
            }
        };

以下是我的个人课程:

作业列表类:

public class JobsList:IJobList
{
    #region IJobList Members
    public List<Jobs> JobList
    {
        get;
        set;
    }
    #endregion
}

工作类别:

public class Jobs:Interfaces.IJobs
{
    #region IJobs Members
    public int ID
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
    public int Age
    {
        get;
        set;
    }
    public string StartDate
    {
        get;
        set;
    }

    public string JobTitle
    {
        get;
        set;
    }
    #endregion
}

当我通过使用 JSON2Csharp 将我的 JSON 转换为生成类时,生成的类如下所示:

public class JobList
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string StartDate { get; set; }
    public string JobTitle { get; set; }
}
public class RootObject
{
    public List<JobList> JobList { get; set; }
}

这在我看来是不正确的。谁能解释为什么我没有在我的 JSON 中将"作业"节点设置为 JobsList 数组?为什么生成的 JSON2CSharp 类将我的"作业"类映射为 JobList 类?

JSON 序列化混淆

基本上,这是因为反序列化程序(在本例中为 JSON2CSharp)不知道您为原始类命名的名称。或者你如何构建它们,就此而言。它不知道您在"我当前的 JSON 字符串"下面发布的任何内容。

当你交给它那个JSON对象时,这就是它正在使用的所有信息。因此,它可以告诉存在某种对象(它称为"RootObject"),它有一个名为"JobList"的对象数组。所以它称这个类为"JobList"。它在那里有一个选择——它可以简单地将列表称为"JobList",并将对象命名为其他东西......但它无法知道它最初来自一个名为"Jobs"的对象,因为它不在 JSON 中。不同的反序列化程序可能以不同的方式完成此操作。

我并不特别熟悉 JSON2CSharp,所以我不知道它是否可以做到这一点,但是有一些框架,给定对象定义,可以解析具有一致命名字段的 JSON 字符串并将其加载到该对象中。例如,使用 Json.NET,您可以执行以下操作:

JobsList jobList = JsonConvert.DeserializeObject<JobsList>(JsonString);