Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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

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# 所需属性';概率';在JSON中找不到。路径_C#_Json_Serialization_Json.net - Fatal编程技术网

C# 所需属性';概率';在JSON中找不到。路径

C# 所需属性';概率';在JSON中找不到。路径,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在反序列化到以下类: public abstract class Tail_Metrics { [DataMember(Order = 1, IsRequired = true)] public double probability { get; set; } [DataMember(Order = 2, IsRequired = true)] public double min { get; set; } [DataMember(Order = 3)

我正在反序列化到以下类:

public abstract class Tail_Metrics
{
    [DataMember(Order = 1, IsRequired = true)]
    public double probability { get; set; }
    [DataMember(Order = 2, IsRequired = true)]
    public double min { get; set; }
    [DataMember(Order = 3)]
    public double max { get; set; }
    [DataMember(Order = 4, IsRequired = true)]
    public double mean { get; set; }
    [DataMember(Order = 5)]
    public double variance { get; set; }
    [DataMember(Order = 6)]
    public double skewness { get; set; }
    [DataMember(Order = 7)]
    public double kurtosis { get; set; }
}
public class Layer_Tail_Metrics : Tail_Metrics { }
如您所见,概率、最小值和平均值是必需的,其余的是可选的

我正在从我的服务器反序列化以下JSON响应:

{
    "probability": 0.01,
    "mean": 0,
    "variance": 0,
    "min": 0,
    "max": 0
}
我得到了一个
Newtonsoft.Json.JsonSerializationException
,其中的消息是
在Json中找不到必需的属性“probability”。路径“”,第1行,位置95。

这怎么可能?属性存在于JSON中,并且具有正确的类型

最奇怪的是,如果我从
DataMember
属性中删除
IsRequired
属性,我将停止获取此异常,并且对象将完全反序列化。如果其中任何一个属性的
IsRequired
属性设置为true,则该属性将引发相同的异常


反序列化代码为:

T retVal = converter.Deserialize<T>(response);

下面是一个复制错误的小独立示例:

[DataContract()]
public abstract class Tail_Metrics
{
    [DataMember(IsRequired = true)]
    public double probability { get; set; }

    public Tail_Metrics(double probability)
    {
        this.probability = probability;
    }
}
public class Layer_Tail_Metrics : Tail_Metrics
{
    public Layer_Tail_Metrics(double probability) : base(probability) { }
}

class TestClass
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""probability"": 0.01
        }";
        Layer_Tail_Metrics tm = Newtonsoft.Json.JsonConvert.DeserializeObject<Layer_Tail_Metrics>(json);
    }
}
[DataContract()]
公共抽象类尾部度量
{
[数据成员(IsRequired=true)]
公共双概率{get;set;}
公共尾部度量(双概率)
{
这个概率=概率;
}
}
公共类层\u Tail\u度量:Tail\u度量
{
公共层尾度量(双概率):基(概率){
}
类TestClass
{
静态void Main(字符串[]参数)
{
字符串json=@”
{
“概率”:0.01
}";
Layer_Tail_Metrics tm=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);
}
}

使用JSON.Net v5.0.8(NuGet中最新版本)的以下控制台程序,我可以很好地使用它:

您发布的JSON是来自服务器的完整JSON响应,还是封装在外部对象中?如果它被包装在另一个对象中,那么这可以解释问题。例如,如果您的JSON实际如下所示:

{
    "response":
    {
        "probability": 0.01,
        "mean": 0,
        "variance": 0,
        "min": 0,
        "max": 0
    }
}

如果您尝试将其反序列化为
Tail_Metrics
,那么JSON.Net将无法匹配任何属性,因为它们在JSON中都是较低一级的属性。如果您在属性上设置了“IsRequired=true”,那么这将导致JSON.Net抛出您看到的异常。如果您删除它,那么JSON.Net将只为类中的
double
属性分配一个默认值零,因为它在JSON中找不到匹配的属性。如果JSON中的所有数据恰好都为零,那么即使它真的以静默方式失败,它看起来也会正常工作。

您可以添加进行反序列化的部分吗?您可以发布反序列化代码吗?另外--当您从just probability中删除“IsRequired”属性时会发生什么?(这是所有必填字段的问题吗?还是仅仅是概率的问题?)尝试将概率的Order属性更改为0,从而将所有后续的Order值更改为比实际值小1的值。从1开始而不是从0开始可能有问题吗?(我对此表示怀疑,但值得一试,因为我想不出还有什么原因会导致这种情况)。@Stijn我已经添加了反序列化程序。@DanEsparza只有在设置了
IsRequired
属性时才会发生这种情况。如果我把它从
probability
中删除,它会继续抱怨
min
。如果我将其从所有类中移除,那么该类将进行反序列化,并且所有值都将通过!嗨,布莱恩-谢谢你尝试重现这个问题。响应没有包含在任何内容中。可以肯定的是,如果我从
DataMember
属性中删除
IsRequired
属性,那么整个对象将进行反序列化,而不会产生任何抱怨。我更新了我的问题,补充了一些我正在做的事情的细节。在我的情况下,这些属性实际上是从抽象基类继承的。你认为那可能是原因吗?有可能。让我更新测试代码,考虑一下,试试看。它对我仍然有效。抽象类和具体类是否都具有
[DataContract]
属性?另外,您正在运行JSON.Net的哪个版本?您是对的,您的测试类正在工作,因此它不是抽象基类。我的课程不及格,但这个简化的课程不及格。我将不得不开始添加构造函数、方法等,直到我发现导致错误的原因。是的,我正要问您的类是否有空构造函数。通常,如果您没有,JSON.Net会因无法创建该对象的实例而发出另一个错误。奇怪的是,在这种情况下它没有这样做。
class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""probability"": 0.01,
            ""mean"": 0,
            ""variance"": 0,
            ""min"": 0,
            ""max"": 0
        }";

        var tm = JsonConvert.DeserializeObject<Layer_Tail_Metrics>(json);
        Console.WriteLine("probability: " + tm.probability);
        Console.WriteLine("mean: " + tm.mean);
        Console.WriteLine("variance: " + tm.variance);
        Console.WriteLine("min: " + tm.min);
        Console.WriteLine("max: " + tm.max);
    }

    [DataContract]
    public class Layer_Tail_Metrics : Tail_Metrics 
    { 
    }

    [DataContract]
    public class Tail_Metrics
    {
        [DataMember(Order = 1, IsRequired = true)]
        public double probability { get; set; }
        [DataMember(Order = 2, IsRequired = true)]
        public double min { get; set; }
        [DataMember(Order = 3)]
        public double max { get; set; }
        [DataMember(Order = 4, IsRequired = true)]
        public double mean { get; set; }
        [DataMember(Order = 5)]
        public double variance { get; set; }
        [DataMember(Order = 6)]
        public double skewness { get; set; }
        [DataMember(Order = 7)]
        public double kurtosis { get; set; }
    }
}
probability: 0.01
mean: 0
variance: 0
min: 0
max: 0
{
    "response":
    {
        "probability": 0.01,
        "mean": 0,
        "variance": 0,
        "min": 0,
        "max": 0
    }
}