c# - Json.Net JsonConvert.SerializeObject json 不正确

标签 c# json json.net

我使用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/

相关文章:

C# 使用 JSON.Net 解析 JSON 数字属性

c# - 当 Newtonsoft.JSON 反序列化失败时,有没有办法返回自定义错误?

json - 如何在 React 中使用 JSON 对象

json - 从 JSON 中提取字段

c# - 如何使 JSON.NET StringEnumConverter 使用连字符分隔的大小写

c# - 使用 SharpSsh 在 ssh 中发送类似 Ctrl+A 的 key

java - 将 JSON(或对象)添加到 STRING json 数组

c# - 用户 session ID 作为 Ajax 调用中的参数

c# - Xamarin - 在 WebView 中请求相机权限

c# - 从字符串创建类实例和调用方法