![](/img/trans.png)
[英]json.net using JsonConvert.SerializeObject adds a comment to output
[英]Json.Net JsonConvert.SerializeObject json not correct
我使用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; }
}
}
根據版本4發布的博客文章 ,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的形式創建。 例如,如果有一個名為“MyFirstName”的字段,您還將創建一個名為“MyFirstNameSpecified”的字段,該字段指示XmlSerializer是否生成名為“MyFirstName”的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
來裝飾這些屬性。
這必定是JSON.NET中的一個錯誤,因為當我從DateTime
屬性中刪除下划線時,它們被正確序列化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.