【问题标题】:JSON.Net not serializing when JsonProperty set?设置 JsonProperty 时 JSON.Net 不序列化?
【发布时间】: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


【解决方案1】:

正如@Jonathan Holland 所指出的,尽管我使用了属性标记,但我实际上并没有使用 Json.Net 进行序列化。我必须实现a custom message formatter 才能做到这一点。幸运的是,我想做的事情可以用常规的DataContractSerializer 来完成,就像this blog post explains

这样就可以解决问题了:

    [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
}

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多