【发布时间】:2013-11-29 20:46:53
【问题描述】:
我正在使用最新 (4.5) 版本的 Newtonsoft Json.Net 来序列化我的 WCF Web 服务返回的复杂类型。出于某种原因,如果我应用 [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] 添加到每个字段(I'm not supposed to have to do,根据 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; }
这会导致(顺序错误):
{
"ChangeOverPrior": 8,
"ChangeOverPriorPercent": 0.25,
"CurrentPeriodValue": 40,
"HasPriorValue": true,
"PriorPeriodValue": 32,
"QueryId": "CitiesMonitored_count",
"SomethingElse": "why am I the only thing visible?"
}
关于如何验证 Json.Net 正在执行序列化的任何想法,如果是,为什么 (Order =) 属性被忽略?
【问题讨论】:
-
为什么顺序很重要?这是一种非常糟糕的 API 气味。
-
能否粘贴配置 WCF 以使用 JSON.NET 作为序列化程序的代码?
-
@JonathanHolland:当然,顺序并不重要。但是,如果以特定方式排序 JSON 表示形式,则更易于人类阅读。至于粘贴配置 WCF 使用 JSON 的代码,已经在上面了:你申请
[JsonObject(MemberSerialization = Newtonsoft.Json.MemberSerialization.OptIn)],除非我错过了一步。 -
我不确定您使用的是哪个特定的 WCF 框架,但该属性不足以告诉它使用 JSON.NET。您仍在使用 DataContractSerializer。
-
您需要实现自定义消息格式化程序以使其使用 JSON.NET。 blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/…
标签: c# json wcf serialization