Json.Net JsonConvert.SerializeObject json is wrong
I am using the latest version (6.0.6) of Json.net to serialize an object and the result is not correct in my opinion.
Result of the below C # example:
"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
As you can see, all non-string properties are not serialized like Entry_No, Line_No, Hours and dates
Is this a bug in Json.Net?
to reproduce the problem,
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; }
}
}
source to share
Json.NET seems to follow the property convention <Name>Specified
to see if its property should be serialized or not, as per version 4 of the release blog post . Thus,
var dto = new ProjectPlanningEntryDto()
{
Key = "AAA",
No = "BBB",
Entry_No = 123,
Entry_NoSpecified = true,
Project_No = "CCC",
Line_No = 456,
Line_NoSpecified = true,
...
};
will result in the desired json object. This convention applies in the same way as for the XmlSerializer, as described here: MSDN: System.Xml.Serialization.XmlSerializer .
Another option is to use a custom template to create a Boolean field recognized by the XmlSerializer and apply the XmlIgnoreAttribute to the field. The template is created as the NameSpecified property. For example, if you have a field named "MyFirstName", you will also create a field named "MyFirstNameSpecified", which instructs the XmlSerializer whether to generate an 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; }
To apply the same logic - and don't serialize properties <Name>Specified
to json - just use JsonIgnoreAttribute
to decorate those properties.
source to share