簡體   English   中英

Json.Net JsonConvert.SerializeObject json不正確

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM