我使用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; }
}
}
答案 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
属性中删除了下划线时,它们被正确序列化了。