繁体   English   中英

设置JsonProperty时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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM