Json.Net JsonConvert.SerializeObject json不正确

时间:2014-11-25 09:23:27

标签: c# json json.net

我使用Json.net的最新版本(6.0.6)来序列化一个对象,在我看来,结果不正确。

以下c#示例的结果如下:

"Key":"AAA","No":"BBB","Project_No":"CCC","Resource_No":"DDD","Resource_Group_No":"EEE","Stadium_Code":"FFF","Entry_NoSpecified":false,"Line_NoSpecified":false,"Execution_DateSpecified":false,"HoursSpecified":false,"ExecutedSpecified":false,"FixedSpecified":false,"ConfirmedSpecified":false,"Begin_TimeSpecified":false,"Updated_TimeSpecified":false

如您所见,所有非字符串属性都未序列化,例如Entry_No,Line_No,Hours和日期

这是Json.Net中的错误吗?

重现问题的代码,

using System;
using Newtonsoft.Json;

namespace JSONNET
{
    class Program
    {
        static void Main(string[] args)
        {
            var dto = new ProjectPlanningEntryDto()
            {
                Key = "AAA",
                No = "BBB",
                Entry_No = 123,
                Project_No = "CCC",
                Line_No = 456,
                Resource_No = "DDD",
                Resource_Group_No = "EEE",
                Execution_Date = DateTime.Now,
                Hours = 4,
                Begin_Time = DateTime.Now,
                Updated_Time = DateTime.Now,
                Stadium_Code = "FFF"
            };

            var json = JsonConvert.SerializeObject(dto);

            Console.WriteLine(json);
            Console.ReadLine();
        }
    }

    public class ProjectPlanningEntryDto
    {
        public string Key { get; set; }
        public string No { get; set; }
        public int Entry_No { get; set; }
        public string Project_No { get; set; }
        public int Line_No { get; set; }
        public string Resource_No { get; set; }
        public string Resource_Group_No { get; set; }
        public DateTime Execution_Date { get; set; }
        public decimal Hours { get; set; }
        public bool Executed { get; set; }
        public bool Fixed { get; set; }
        public bool Confirmed { get; set; }
        public DateTime Begin_Time { get; set; }
        public DateTime Updated_Time { get; set; }
        public string Stadium_Code { get; set; }
        public bool Entry_NoSpecified { get; set; }
        public bool Line_NoSpecified { get; set; }
        public bool Execution_DateSpecified { get; set; }
        public bool HoursSpecified { get; set; }
        public bool ExecutedSpecified { get; set; }
        public bool FixedSpecified { get; set; }
        public bool ConfirmedSpecified { get; set; }
        public bool Begin_TimeSpecified { get; set; }
        public bool Updated_TimeSpecified { get; set; }
    }
}

2 个答案:

答案 0 :(得分:3)

根据version 4 release blog post,Json.NET似乎遵守了<Name>Specified属性的约定,以确定它是否应该序列化属性。所以,

var dto = new ProjectPlanningEntryDto()
{
    Key = "AAA",
    No = "BBB",
    Entry_No = 123,
    Entry_NoSpecified = true,
    Project_No = "CCC",
    Line_No = 456,
    Line_NoSpecified = true,
    ...
};

会产生你想要的json对象。此约定的应用方式与应用于XmlSerializer的方式相同,详见此处:MSDN: System.Xml.Serialization.XmlSerializer

  

另一种选择是使用特殊模式创建XmlSerializer可识别的布尔字段,并将XmlIgnoreAttribute应用于该字段。该模式以propertyNameSpecified的形式创建。例如,如果有一个名为&#34; MyFirstName&#34;你还可以创建一个名为&#34; MyFirstNameSpecified&#34;的字段。指示XmlSerializer是否生成名为&#34; MyFirstName&#34;的XML元素。这在以下示例中显示。

public class OptionalOrder
{
    // This field should not be serialized 
    // if it is uninitialized.
    public string FirstOrder;

    // Use the XmlIgnoreAttribute to ignore the 
    // special field named "FirstOrderSpecified".
    [System.Xml.Serialization.XmlIgnoreAttribute]
    public bool FirstOrderSpecified;
}

要应用相同的逻辑 - 而不是序列化json中的<Name>Specified属性 - 只需使用JsonIgnoreAttribute来装饰这些属性。

答案 1 :(得分:0)

这一定是JSON.NET中的一个错误,因为当我从DateTime属性中删除了下划线时,它们被正确序列化了。