Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置JsonProperty时JSON.Net未序列化?_C#_Json_Wcf_Serialization - Fatal编程技术网

C# 设置JsonProperty时JSON.Net未序列化?

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)]

我正在使用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; }
导致(顺序错误):


关于如何验证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。