![](/img/trans.png)
[英]Serializing type information using a different JsonProperty in Json.Net
[英]JSON.Net not serializing when JsonProperty set?
我正在使用Newtonsoft Json.Net的最新(4.5)版本来序列化由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]
添加到每个字段(根据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 =)
属性被忽略?
正如@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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.