我使用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; }
}
}
最佳答案
根据 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。
Another option is to use a special pattern to create a Boolean field recognized by the XmlSerializer, and to apply the XmlIgnoreAttribute to the field. The pattern is created in the form of propertyNameSpecified. For example, if there is a field named "MyFirstName" you would also create a field named "MyFirstNameSpecified" that instructs the XmlSerializer whether to generate the XML element named "MyFirstName". This is shown in the following example.
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
来修饰这些属性。
关于c# - Json.Net JsonConvert.SerializeObject json 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122856/