C# 设置JsonProperty时JSON.Net未序列化?
我正在使用Newtonsoft Json.Net的最新(4.5)版本来序列化WCF web服务返回的复杂类型。出于某种原因,如果我应用C# 设置JsonProperty时JSON.Net未序列化?,c#,json,wcf,serialization,C#,Json,Wcf,Serialization,我正在使用Newtonsoft Json.Net的最新(4.5)版本来序列化WCF web服务返回的复杂类型。出于某种原因,如果我应用[JsonProperty]属性,字段就不会序列化: [DataContract] [JsonObject(MemberSerialization = Newtonsoft.Json.MemberSerialization.OptIn)] public class ScalarResult { [JsonProperty(Order = 0)]
[JsonProperty]
属性,字段就不会序列化:
[DataContract]
[JsonObject(MemberSerialization = Newtonsoft.Json.MemberSerialization.OptIn)]
public class ScalarResult
{
[JsonProperty(Order = 0)]
public string QueryId { get; set; }
[JsonProperty(Order = 1)]
public float CurrentPeriodValue { get; set; }
[JsonProperty(Order = 2)]
public bool HasPriorValue { get; set; }
[JsonProperty(Order = 3)]
public float PriorPeriodValue { get; set; }
[JsonProperty(Order = 4)]
public float ChangeOverPrior { get; set; }
[JsonProperty(Order = 5)]
public float ChangeOverPriorPercent { get; set; }
这将导致一个粗略的返回对象:
{
"SomethingElse": "why am I the only thing visible?"
}
如果我将[DataMember]
添加到每个字段(根据Json.NET文档),那么这些字段就会显示出来,但是(Order=x)
属性会被忽略,这让我相信Json.NET实际上可能没有进行序列化:
[DataContract]
[JsonObject(MemberSerialization = Newtonsoft.Json.MemberSerialization.OptIn)]
public class ScalarResult
{
[DataMember]
[JsonProperty(Order = 0)]
public string QueryId { get; set; }
[DataMember]
public string SomethingElse { get; set; }
[DataMember]
[JsonProperty(Order = 1)]
public float CurrentPeriodValue { get; set; }
[DataMember]
[JsonProperty(Order = 2)]
public bool HasPriorValue { get; set; }
[DataMember]
[JsonProperty(Order = 3)]
public float PriorPeriodValue { get; set; }
[DataMember]
[JsonProperty(Order = 4)]
public float ChangeOverPrior { get; set; }
[DataMember]
[JsonProperty(Order = 5)]
public float ChangeOverPriorPercent { get; set; }
导致(顺序错误):
关于如何验证Json.Net是否正在进行序列化,以及如果是,为什么忽略
(Order=)
属性,有什么想法吗?正如@Jonathan Holland所指出的,尽管我有属性标记,但我实际上并没有使用Json.Net进行序列化。要做到这一点,我必须实施。幸运的是,我想用常规的DataContractSerializer
完成我想做的事情,如下所示
因此,这将实现以下目的:
[DataContract]
public class ScalarResult
{
[DataMember(Order = 0)]
public string QueryId { get; set; }
[DataMember(Order = 1)]
public float CurrentPeriodValue { get; set; }
[DataMember(Order = 2)]
public bool HasPriorValue { get; set; }
[DataMember(Order = 3)]
public float PriorPeriodValue { get; set; }
[DataMember(Order = 4)]
public float ChangeOverPrior { get; set; }
[DataMember(Order = 5)]
public float ChangeOverPriorPercent { get; set; }
// rest of code here
}
现在的结果与预期的一样:
{
"QueryId": "SystemsMonitored_count",
"CurrentPeriodValue": 60,
"HasPriorValue": true,
"PriorPeriodValue": 47,
"ChangeOverPrior": 13,
"ChangeOverPriorPercent": 0.276595742
}
正如@Jonathan Holland所指出的,尽管我使用了属性标记,但实际上我并没有使用Json.Net进行序列化。要做到这一点,我必须实施。幸运的是,我想用常规的
DataContractSerializer
完成我想做的事情,如下所示
因此,这将实现以下目的:
[DataContract]
public class ScalarResult
{
[DataMember(Order = 0)]
public string QueryId { get; set; }
[DataMember(Order = 1)]
public float CurrentPeriodValue { get; set; }
[DataMember(Order = 2)]
public bool HasPriorValue { get; set; }
[DataMember(Order = 3)]
public float PriorPeriodValue { get; set; }
[DataMember(Order = 4)]
public float ChangeOverPrior { get; set; }
[DataMember(Order = 5)]
public float ChangeOverPriorPercent { get; set; }
// rest of code here
}
现在的结果与预期的一样:
{
"QueryId": "SystemsMonitored_count",
"CurrentPeriodValue": 60,
"HasPriorValue": true,
"PriorPeriodValue": 47,
"ChangeOverPrior": 13,
"ChangeOverPriorPercent": 0.276595742
}
为什么秩序很重要?这是一种非常糟糕的API味道。你能粘贴配置WCF的代码,以使用JSON.NET作为序列化程序吗?@JonathanHolland:当然,顺序并不重要。但是,如果JSON表示是以特定的方式排序的,那么它的可读性要高得多。至于粘贴配置WCF以使用JSON的代码,上面已经提到了:您应用
[JsonObject(MemberSerialization=Newtonsoft.JSON.MemberSerialization.OptIn)]
,除非我遗漏了一个步骤。我不确定您使用的是什么特定的WCF框架,但该属性不足以告诉它使用JSON.NET。您仍在使用DataContractSerializer。您需要实现一个自定义消息格式化程序,使其使用JSON.NET。为什么秩序很重要?这是一种非常糟糕的API味道。你能粘贴配置WCF的代码,以使用JSON.NET作为序列化程序吗?@JonathanHolland:当然,顺序并不重要。但是,如果JSON表示是以特定的方式排序的,那么它的可读性要高得多。至于粘贴配置WCF以使用JSON的代码,上面已经提到了:您应用[JsonObject(MemberSerialization=Newtonsoft.JSON.MemberSerialization.OptIn)]
,除非我遗漏了一个步骤。我不确定您使用的是什么特定的WCF框架,但该属性不足以告诉它使用JSON.NET。您仍在使用DataContractSerializer。您需要实现一个自定义消息格式化程序,使其使用JSON.NET。